【问题标题】:Pivot Table - Max() in Combination with Case数据透视表 - Max() 结合案例
【发布时间】:2016-05-31 01:02:44
【问题描述】:

我有以下查询:

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) 它工作得很好,但当然它会在数据透视表中显示修改日期而不是“x”。

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

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

我错过了什么?

【问题讨论】:

    标签: sql tsql pivot case


    【解决方案1】:

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

    【讨论】:

    • 所以这不是语法,很高兴知道。明天我将尝试使用固定表达式的解决方案 - 谢谢!
    • 它的工作方式与您发布的方式不完全一样,但总体思路似乎是正确的——现在由我来实现它。谢谢!
    【解决方案2】:

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

    将您的案例部分更改为:

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

    你可以阅读它here

    【讨论】:

    • 这一切都很好,但这不是 syntax 错误,错误在 CASE 部分。
    • 大小写语法本身是正确的,我已经更新了与字符串部分相关的答案。这就是你的意思吗? @JoachimIsaksson
    • CASE 语法是正确的,问题似乎在于您根本无法在 case 语句上进行旋转。
    • 我希望你确实意识到@query 变量是一个字符串文字,我非常怀疑你是否可以使用嵌套的单引号。此外,正如 Joachim 指出的那样,问题似乎不在语法之内,而更多是因为您显然不能在枢轴中使用 case 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多