给定一个表是这样的:`PIVOT`用`EXISTS`
[Last Name] [First Name] [DepartmentID]
---------------------------------------
Doe John 1
Doe John 2
Black Frank 3
,我想这样的结果:
[Last Name] [First Name] [Accounting] [Management] [Development]
----------------------------------------------------------------
Doe John X X
Black Frank X
到目前为止,我有这样的查询:
SELECT [Last Name], [First Name], [1], [2], [3]
FROM Employees
PIVOT(SUM(DepartmentID) FOR DepartmentID IN ([1], [2], [3])
GROUP BY [Last Name], [First Name], [1], [2], [3]
这给了我:
[Last Name] [First Name] [1] [2] [3]
----------------------------------------------------------------
Doe John 1
Doe John 2
Black Frank 3
个
几个问题:
- 列名称来自别处,即应当从函数或子查询的。这可以做到吗?
- 我假设我将不得不使用动态SQL来获取可能的部门,即我不能告诉
PIVOT
只是确定所有可能性? - 列值应该是'X'(或类似),不包含实际值。每个可能的部门不应该有多行,这意味着我无法通过枢轴列进行分组。我如何获得每人一行?
我真的不想要或不需要聚合任何东西;我只是希望根据每个部门展示该员工是否居住在该部门。是PIVOT
这个红鲱鱼吗?我可以用更复杂的方式解决这个问题,每个部门有EXISTS
声明?
您应该删除'GROUP BY [姓氏],[名],[1] ,[2],[3]'位。这是毫无意义的。顺便说一句,你必须在你的表中有一个额外的列,你没有向我们显示像导致多行问题的“RecordId”。 [每位员工只返回1行](http://data.stackexchange.com/stackoverflow/query/60760/new) – 2012-02-03 17:57:06
确实有更多的列,它们可能会有所不同。你也是正确的,PIVOT似乎意味着GROUP BY。 – 2012-02-03 18:21:43
解决方法是使用CTE或派生表作为仅包含3列感兴趣的PIVOT源。你可以使用'CASE'语句来获得你的'X'而不是数字。如果列列表是动态的,则需要动态SQL。 – 2012-02-03 18:24:41