簡體   English   中英

將SQL行值轉換為列

[英]Convert SQL Row values into Columns

我有一個Employee表,當我按照SQL進行查詢時,它給出以下結果:

 Select ID, Role as "Role Name", Employee as "Employee Name"
from employee

查詢結果

現在,我想按照下面的圖像轉換上面的查詢結果。 我將Pivot與max和min結合使用,然后進行並集,但是它只給出了兩個與Role名稱相對應的雇員名稱。 我需要得到如下結果。 有什么建議嗎?

預期產量

select
       id,

       case when [Role Name] = 'Consultant' 
            then [Employee Name] else null 
       end as Consultant,

       case when [Role Name] = 'Manager' 
            then [Employee Name] else null 
       end as Manager
from
     employee

如果您還有其他角色,則可以添加更多案例陳述

使用Pivot,

select 
    id,
    Consultant, 
    Manager
from 
    ( select 
        id,
        [Role Name],
        [Employee Name], 
        row_number() over( partition by id order by id) as rn 
      from 
        employee
    ) src 
pivot 
    ( max([Employee Name]) for [Role Name] in (Consultant,Manager) ) as pvt ;

更新資料

如果您有多個角色或角色數量不固定,那么這可能不是一個好的解決方案。

一種方法是動態樞軸

喬弗布的方法是一種非常好的方法。 如果您正在學習SQL,請考慮以下另一種方法:

select id, employeename as consultant, null as manager
from employee
where rolename = 'Consultant'
union all
select id, null as employeename as manager
from employee
where rolename = 'Manager';

這需要掃描employee表兩次-對於小型表來說這是微不足道的。

編輯:

不需要大量case表達式的另一種方法使用join

select e.id, v.*
from employee e join
     (values ('consultant', employeename, null),
             ('manager',  null, employeename)
     ) v(rolename, consultant, manager)
     on e.rolename = v.rolename;

不過,您必須為values()每一行鍵入一堆null

萬一您可以更改的角色數量,這可以作為將來的答案。 因此,您需要更改您的SQL。 這樣可以避免這種需求,但是(像Gordan的當前答案一樣)確實需要對表進行2次掃描:

CREATE TABLE Employee (ID int, [Role] varchar(10), Employee varchar(15));

INSERT INTO Employee
VALUES (1, 'Manager','Steve'),
       (2, 'Consultant','Jayne');

GO
--Hard coded SQL solution

SELECT ID,
       CASE [Role] WHEN 'Manager' THEN Employee END AS Manager,
       CASE [Role] WHEN 'Consultant' THEN Employee END AS Consultant
FROM Employee;
GO
--Now, let's add a another role, and try the SQL again:
INSERT INTO Employee
VALUES (3, 'Director','Sally');
SELECT ID,
       CASE [Role] WHEN 'Manager' THEN Employee END AS Manager,
       CASE [Role] WHEN 'Consultant' THEN Employee END AS Consultant
FROM Employee;
--Unsurprisingly, Sally doesn't appear, but a "blank" row does
GO
--Dynamic SQL solution:
DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT ID,' +NCHAR(10) +
           STUFF((SELECT DISTINCT N',' + NCHAR(10) +
                                  N'       CASE [Role] WHEN ' + QUOTENAME([Role],N'''') + N' THEN Employee END AS ' + QUOTENAME([Role])
                  FROM Employee
                  FOR XML PATH(N'')),1,2,N'') + NCHAR(10) +
           N'FROM Employee;';
PRINT @SQL; --your best friend
EXEC sp_executesql @SQL;
GO

DROP TABLE Employee;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM