'PIVOT`与'EXISTS`

Sör*_*lau 2 sql t-sql pivot sql-server-2008

给出这样的表:

[Last Name] [First Name] [DepartmentID]
---------------------------------------
Doe         John         1
Doe         John         2
Black       Frank        3
Run Code Online (Sandbox Code Playgroud)

,我想要一个像这样的结果:

[Last Name] [First Name] [Accounting] [Management] [Development]
----------------------------------------------------------------
Doe         John         X            X
Black       Frank                                  X
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这样的查询:

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]
Run Code Online (Sandbox Code Playgroud)

这给了我:

[Last Name] [First Name] [1] [2] [3]
----------------------------------------------------------------
Doe         John         1
Doe         John             2
Black       Frank                3
Run Code Online (Sandbox Code Playgroud)

几个问题:

  • 列名来自其他地方,即它应该从函数或子查询派生.可以这样做吗?
  • 我假设我将不得不使用动态SQL来获得可能的部门,即我不能PIVOT简单地确定所有可能性?
  • 列值应该只是'X'(或类似),不包含实际值.每个可能的部门不应该有每行多行,这意味着我无法按透视列进行分组.我如何获得每人一行?

我真的不想或不需要聚合任何东西; 我只希望按部门说明员工是否居住在该部门.这是PIVOT一个红鲱鱼?我可以通过EXISTS每个部门的声明以更复杂的方式解决这个问题吗?

Ari*_*ion 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'
Run Code Online (Sandbox Code Playgroud)

列的结尾:

DECLARE @cols VARCHAR(MAX)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME(Name),
                     QUOTENAME(Name))
FROM 
    tblDepartment
ORDER BY 
    Name
Run Code Online (Sandbox Code Playgroud)

或者您可能希望仅使用现有的列连接列,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

然后执行动态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)
Run Code Online (Sandbox Code Playgroud)

在我的情况下删除创建的表:

DROP TABLE tbl
DROP TABLE tblDepartment
Run Code Online (Sandbox Code Playgroud)

  • +1; 你也可以用`QUOTENAME(Name,'[')`替换''['+ Name +']'` (2认同)
  • 我一直在研究我整个早上都遇到的PIVOT问题,这是迄今为止我见过的最好的答案. (2认同)