给出一个这样的表:
[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
几个问题:
PIVOT
简单地确定所有可能性?我真的不想或不需要聚合任何东西;我只希望按部门说明员工是否居住在该部门。 PIVOT
这是一个红鲱鱼吗?我可以用更复杂的方式解决这个问题,每个部门都有一个EXISTS
语句吗?
答案 0 :(得分:10)
也许这会有所帮助:
首先是一些测试数据:
CREATE TABLE tbl(LastName VARCHAR(100),FirstName VARCHAR(100),DepartmentID INT)
CREATE TABLE tblDepartment(DepartmentID INT,Name VARCHAR(100))
INSERT INTO tbl
SELECT 'Doe','John',1 UNION ALL
SELECT 'Doe','John',2 UNION ALL
SELECT 'Black','Frank',3
INSERT INTO tblDepartment
SELECT 1,'Accounting' UNION ALL
SELECT 2,'Management' UNION ALL
SELECT 3,'Development'
汇总列:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(Name),
QUOTENAME(Name))
FROM
tblDepartment
ORDER BY
Name
或者您可能希望仅使用现有的列来连接列:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(Name),
QUOTENAME(Name))
FROM
tblDepartment
WHERE EXISTS
(
SELECT
NULL
FROM
tbl AS tbl2
WHERE
tblDepartment.DepartmentID=tbl2.DepartmentID)
ORDER BY
Name
然后执行动态sql:
DECLARE @query NVARCHAR(4000)=
N'SELECT
*
FROM
(
SELECT
tbl.LastName,
tbl.FirstName,
Department.Name,
''X'' as test
FROM
tbl AS tbl
JOIN tblDepartment AS Department
ON Department.DepartmentID=tbl.DepartmentID
)AS p
PIVOT
(
MAX(test) FOR Name IN ('+@cols+')
) As Pvt'
EXECUTE(@query)
在我的情况下删除创建的表:
DROP TABLE tbl
DROP TABLE tblDepartment