Pivot Table - 结合大小写的 Max()

Pivot Table - Max() in Combination with 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
            ).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(CASE when [ID_FK_Group] != null THEN "x" ELSE " " END) 它工作得很好,但当然它会在枢轴 table 中显示 moddate 而不是 "x"。

我尝试将 case 语句的不同组合与 MAX() 结合使用,但由于某种原因,我总是以相同的错误结束:

Incorrect syntax near the keyword 'CASE'.

我错过了什么?

你的语法不正确,在处理空值时你应该使用 IS NULLIS NOT NULL ,你也应该只使用使用字符串值时,一个撇号而不是两个。

将您的案例部分更改为:

MAX(CASE when [ID_FK_Group] is not null THEN 'x' ELSE ' ' END)

你可以阅读它here

您似乎无法转换 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