Sql Pivot Table-Max()与Case组合使用
我有以下疑问:Sql Pivot Table-Max()与Case组合使用,sql,tsql,pivot,case,Sql,Tsql,Pivot,Case,我有以下疑问: DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ID_FK_Group) from [randomDb].[dbo].[table_GroupMembership] FOR XML PATH(''), TYPE ).va
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ID_FK_Group)
from [randomDb].[dbo].[table_GroupMembership]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [UserDisplayName], ' + @cols + ' from
(
select u.DisplayName as [UserDisplayName], gm.ID_FK_Group as [ID_FK_Group], gm.ModDate as [ModDate]
from [randomDb].[dbo].[table_user] u
join [randomDb].[dbo].[table_GroupMembership] gm on u.id_pk_user = gm.id_fk_user
) x
pivot
(
MAX(CASE when [ID_FK_Group] != null THEN "x" ELSE " " END)
for [ID_FK_Group] in (' + @cols + ')
) p '
execute(@query)
如果我使用MAX([ModDate])
而不是MAX(当[ID\u FK\u Group]!=null时,则使用“x”ELSE“END)
它工作得很好,但是它当然会在透视表中显示ModDate而不是“x”
我曾尝试将case
语句的不同组合与MAX()
结合使用,但由于某些原因,我总是会出现相同的错误:
关键字“CASE”附近的语法不正确
我遗漏了什么?您的语法不正确,在处理空值时,您应该使用IS null和IS NOT null,并且在使用字符串值时,您应该只使用一个撇号,而不是两个撇号 将您的案例部分更改为:
MAX(CASE when [ID_FK_Group] is not null THEN 'x' ELSE ' ' END)
您可以阅读它似乎您无法围绕
CASE
语句,因此您必须将表达式移出查询,例如
SELECT [UserDisplayName], ' + @cols + ' from
(
select u.DisplayName as [UserDisplayName], gm.ID_FK_Group as [ID_FK_Group],
CASE when [ID_FK_Group] is not null THEN 'x' ELSE ' ' END tmp
from [randomDb].[dbo].[table_user] u
join [randomDb].[dbo].[table_GroupMembership] gm on u.id_pk_user = gm.id_fk_user
) x
pivot
(
MAX(tmp)
for [ID_FK_Group] in (' + @cols + ')
) p
这很好,但这不是语法错误,错误在
CASE
部分。CASE语法本身是正确的,我已经更新了我的答案,使之与字符串部分相关。。这就是你的意思,对吗@joachimisakssonCASE
语法是正确的,但问题似乎是您根本无法关注CASE语句。我希望您意识到@query变量是字符串文字,我非常怀疑您是否可以使用嵌套单引号。此外,正如Joachim所指出的,问题似乎不在语法范围内,而更多地是因为您显然无法在pivot中使用case语句。因此,很高兴知道这不是语法。明天我将用固定表达式尝试您的解决方案-谢谢!它的工作方式与您发布它的方式不完全相同,但总体思路似乎是正确的——现在由我来实施它。非常感谢。