[英]Convert SQL Row values into Columns
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.