[英]SQL Server 2008 R2: Pivot table on VARCHAR column
表:
CREATE TABLE EMPDetails
(
ID int,
EmpName varchar(20),
ColumnName varchar(20),
ColumnValue varchar(20)
);
記錄:
INSERT INTO EMPDetails Values(1,'S','Company','Microsoft');
INSERT INTO EMPDetails Values(1,'S','Profession','Database');
INSERT INTO EMPDetails Values(1,'S','Location','USA');
INSERT INTO EMPDetails Values(1,'S','Company','Unisys');
INSERT INTO EMPDetails Values(1,'S','Company','TATA');
INSERT INTO EMPDetails Values(2,'U','Company','Microsoft');
INSERT INTO EMPDetails Values(2,'U','Profession','Software');
INSERT INTO EMPDetails Values(2,'U','Location','UK');
INSERT INTO EMPDetails Values(2,'U','Company','DXC');
INSERT INTO EMPDetails Values(2,'U','Company','AOL');
INSERT INTO EMPDetails Values(3,'R','Company','Microsoft');
INSERT INTO EMPDetails Values(3,'R','Profession','Software');
INSERT INTO EMPDetails Values(3,'R','Location','UK');
INSERT INTO EMPDetails Values(3,'R','Company','AOL');
我的嘗試
條件 1 : Company = 'Microsoft' AND Profession = 'Database'
預期結果:
ID EmpName Company Profession Location
-----------------------------------------
1 S Microsoft Database USA
詢問:
SELECT *
FROM
(
SELECT ID, EmpName,ColumnValue, ColumnName
FROM EMPDetails
) src
PIVOT
(
MAX(ColumnValue) /*OR MIN()*/
FOR ColumnName in ([Company], [Profession], [Location])
) piv
WHERE Company = 'Microsoft' AND Profession = 'Database'
條件 2 : Company = 'Microsoft' AND Profession = 'Software'
預期結果:
ID EmpName Company Profession Location
-----------------------------------------
3 R Microsoft Software UK
2 U Microsoft Software UK
詢問 :
SELECT *
FROM
(
SELECT ID, EmpName,ColumnValue, ColumnName
FROM EMPDetails
) src
PIVOT
(
MAX(ColumnValue) /*OR MIN()*/
FOR ColumnName in ([Company], [Profession], [Location])
) piv
WHERE Company = 'Microsoft' AND Profession = 'Software'
問題:如果我在條件 1 下使用MIN()
聚合函數,那么會得到結果,但不會使用MAX()
而條件 2 則相反。為什么?
您可以GROUP BY
員工並在HAVING
子句中使用條件計數,以獲取滿足條件的員工:
SELECT ID, EmpName
FROM EMPDetails
GROUP BY ID, EmpName
HAVING COUNT(CASE
WHEN ColumnName = 'Company' AND
ColumnValue = 'Microsoft' THEN 1
END) > 0
AND
COUNT(CASE
WHEN ColumnName = 'Profession' AND
ColumnValue = 'Database' THEN 1
END) > 0
上面的查詢選擇將Microsoft
作為Company
和Database
作為Profession
員工。
輸出:
ID EmpName
------------
1 S
您現在可以使用條件聚合來透視員工行:
SELECT ID, EmpName,
'Microsoft' AS Company,
'Database' AS Profession,
MAX(CASE WHEN ColumnName = 'Location' THEN ColumnValue END) AS Location
FROM EMPDetails
GROUP BY ID, EmpName
HAVING COUNT(CASE
WHEN ColumnName = 'Company' AND
ColumnValue = 'Microsoft' THEN 1
END) > 0
AND
COUNT(CASE
WHEN ColumnName = 'Profession' AND
ColumnValue = 'Database' THEN 1
END) > 0
不需要對 Company 或 Profession 值進行聚合,因為所需的值保證屬於員工組。
輸出:
ID EmpName Company Profession Location
-----------------------------------------
1 S Microsoft Database USA
要獲得第二個結果集,您可以簡單地用Software
替換Database
:
SELECT ID, EmpName,
'Microsoft' AS Company,
'Software' AS Profession,
MAX(CASE WHEN ColumnName = 'Location' THEN ColumnValue END) AS Location
FROM EMPDetails
GROUP BY ID, EmpName
HAVING COUNT(CASE
WHEN ColumnName = 'Company' AND
ColumnValue = 'Microsoft' THEN 1
END) > 0
AND
COUNT(CASE
WHEN ColumnName = 'Profession' AND
ColumnValue = 'Software' THEN 1
END) > 0
輸出:
ID EmpName Company Profession Location
---------------------------------------------
3 R Microsoft Software UK
2 U Microsoft Software UK
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.