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 NULL 和 IS 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
我有以下查询:
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 NULL 和 IS 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