簡體   English   中英

SQL Server 2008 R2:VARCHAR 列上的數據透視表

[英]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');

我的嘗試

條件 1Company = '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'  

條件 2Company = '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作為CompanyDatabase作為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.

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