数据透视表 - Max()与案例结合

时间:2016-02-18 17:42:48

标签: 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
            ).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),它可以正常工作,但当然它会在数据透视表中显示moddate而不是“x”。

我尝试将case语句的不同组合与MAX()结合使用,但出于某种原因,我总是遇到同样的错误:

  

关键字'CASE'附近的语法不正确。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

似乎你无法转移MyClass c1 = new MyClass(f1=2.1 , f48=3.5); MyClass c2 = new MyClass(f4=5 , f30=12.9); public class MyClass{ double f1; double f2; double f3; ... double f60; } 语句,所以你必须将表达式移到查询中,例如;

CASE

答案 1 :(得分:0)

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

将您的案例部分更改为:

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

您可以阅读here