问题:数据库错误 0x80004005: 无法识别的关键字 WHEN。用case 主要为了解决group by出来的字段既需要有作为列字段的又需要有作为行字段的报表问题。

我的tableau数据源是access数据库。在自定义sql查询语句中,

SELECT 
  sum([工资表].[应发合计]) AS [应发合计],
  [工资表].[员工类别] AS [员工类别],
  sum(case [预算岗类修正] when  '一类合同工' then 1 else 0) as [一类合同工],
  [工资表].[组织编码] AS [组织编码]
FROM [工资表]
group by [工资表].[员工类别],[工资表].[组织编码]



数据库错误 0x80004005: 无法识别的关键字 WHEN。

; The query: SELECT TOP 1 * FROM ( SELECT sum([工资表].[应发合计]) AS [应发合计], [工资表].[员工类别] AS [员工类别], sum(case [预算岗类修正] when '一类合同工' then 1 else 0) as [一类合同工], [工资表].[组织编码] AS [组织编码] FROM [工资表] group by [工资表].[员工类别],[工资表].[组织编码] ) [TableauSQL]
无法连接到 Microsoft Access 数据库 "E:/a_data/薪酬.accdb"。检查路径是否正确以及您是否有权访问请求的文件。

原因:access数据库sql语句中,是不能识别when的。但在sql数据库中,应该可以正常识别。


使用SQL Server数据库和使用Access数据库所用到的语句不同,下面分别叙述:
 SQL Server:
 使用case when语句。
 语法如下:
 case 数据库字段
 when 条件1 then 结果1
 when 条件2 then 结果2
 ……
 else 上面条件都不满足时的结果
 end



Access:
使用iff()函数。
语法如下:
IIf(expr, truepart, falsepart)
点击这里,查看Microsoft Office对其的介绍。
IIf 函数语法的参数说明:
expr            必需。要计算其值的表达式。
truepart      必需。expr为True时返回的值或表达式。
falsepart    必需。expr为False时返回的值或表达式。
意思是:当条件成立时,返回正确结果;当条件不成立时,返回错误结果。
注意:
尽管IIf只返回truepart和falsepart中的一个,但始终会对这两部分进行计算。因此,应当注意是否出现无谓的副作用。例如,如果计算falsepart时导致除数为零错误,那么即使expr为True,也会产生错误。
例子:select iif(IfPaid=1,'是','否') as 是否已付款 from Accounts
根据长度截断字符串:select iif(LEN(Title)>20,left(Title,20),Title) as Title from Articles
注意:
如果是要把数据绑定到DataGridView,而DataGridView的列事先已经定义好了的话,把查询语句中通过此方法获得值的列的as后的定义赋值给对应列的DataPropertyName即可显示出查询到的值。比如把上面语句的Title赋值给DataGridView添加的对应列的DataPropertyName即可显示数据库中原Title列中的值截取前20个字符后的值。




1.IIf函数

根据表达式的值,来返回两部分中的其中一个。语法IIf(expr,truepart,falsepart)IIf函数的语法含有下面这些命名参数:部分描述expr必要参数。用来判断真伪的表达式。truepart必要参数。如果expr为True,则返回这部分的值或表达式。falsepart必要参数。如果expr为False,则返回这部分的值或表达式。说明由于IIf会计算truepart和falsepart,虽然它只返回其中的一个。因此要注意到这个副作用。例如,如果falsepart产生一个被零除错误,那么程序就会发生错误,即使expr为True。select iif(col='0','ok',iif(col='1','err1',iif(col='2','err2','err3')))ascolnamefromtable
2. Switch

在Access无法使用SQL语句中的case when语句,但可以通过Switch函数实现例如:

Switch(成绩<60,"不及格",成绩 Between 61 And 74,"中",成绩Between 75 And 88,"良",成绩 Between 88 And 100,"优") AS 成绩等级

可以实现对成绩的值进行多分支条件判断结构