我的数据如下:
Name CategoryName
Test1 cat1
Test1 cat2
Test2 cat1
Test3 cat2
我想显示它,以便在类别名称下获得1/0(真/假)的用户列表:
Name cat1 cat2
Test1 1 1
Test2 1 0
Test3 0 1
使用以下sql我可以生成1但我无法弄清楚如何获得0。
注意:获取类别中用户的sql与我实际使用的内容相比非常简单,因此可能不完全正确
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.CategoryName)
FROM Category c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Name, ' + @cols + ' from
(
SELECT Name
CategoryName,
1 as assigned
FROM User INNER JOIN
UserCategory ON User.ID = UserCategory.UserID
) x
pivot
(
max(assigned)
for CategoryName in (' + @cols + ')
) p '
execute(@query)
我可以更新它以生成1/0,而不是1 / null吗?
编辑 - 解决方案 感谢@Tab Allerman
我更新了这个,所以我有2个cols变量
SET @colsForSelect = STUFF((SELECT distinct ', ISNULL(' + QUOTENAME(c.CategoryName) + ',0) AS ' + QUOTENAME(c.CategoryName)
FROM Category c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
并保留原来的@cols。 我在查询的开头使用了@colsForSelect,然后在'枢轴中使用了@cols的原始@cols。 我希望这对任何需要帮助的人都有意义
答案 0 :(得分:0)
SET @cols = STUFF((SELECT distinct ', ISNULL(' + QUOTENAME(c.CategoryName) + ',0) AS ' + QUOTENAME(c.CategoryName)