sqlserver 行列轉換(行傳換為列)


1.原始查詢

SELECT s.Name AS ShiftName,
        h.BusinessEntityID,
        d.Name AS DepartmentName
FROM HumanResources.EmployeeDepartmentHistory h
INNER JOIN HumanResources.Department d
ON h.DepartmentID = d.DepartmentID
INNER JOIN HumanResources.Shift s
ON h.ShiftID = s.ShiftID
WHERE EndDate IS NULL
AND d.Name IN ('Production', 'Engineering', 'Marketing')
ORDER BY ShiftName;

 

結果如下

 

在這個結果集中,我們可以看到所有的部門都列在一個列中。下一步是將此查詢返回的部門值轉換為列,以及按班次計算的員工數。

想要實現的效果

 

 

2.用PIVOT關鍵字進行行列轉換

 1 SELECT  ShiftName,        
 2                 Production,        
 3                 Engineering,        
 4                 Marketing
 5 FROM    (SELECT s.Name AS ShiftName,       
 6                             h.BusinessEntityID,      
 7                             d.Name AS DepartmentName         
 8                 FROM   HumanResources.EmployeeDepartmentHistory h                
 9                 INNER JOIN HumanResources.Department d                    
10                 ON h.DepartmentID = d.DepartmentID                
11                 INNER JOIN HumanResources.Shift s                    
12                 ON h.ShiftID = s.ShiftID         
13                 WHERE  EndDate IS NULL                
14                 AND d.Name IN ('Production', 'Engineering', 'Marketing')        
15                 ) AS a
16 PIVOT
17     ( 
18     COUNT(BusinessEntityID)
19     FOR DepartmentName IN ([Production], [Engineering], [Marketing])
20     )  AS b
21 ORDER BY ShiftName;

結果如下:

 

 

3.轉換的語法如下:

 

 4.參數的定義如下:

 

官網示義

 

 

 

 

 

 

 

 

 

5.在引入PIVOT操作符之前,我們是通過以下語句進行轉換的

 1 SELECT  s.Name AS ShiftName,      
 2                 SUM(CASE WHEN d.Name = 'Production' THEN 1 ELSE 0 END) AS Production,        
 3                 SUM(CASE WHEN d.Name = 'Engineering' THEN 1 ELSE 0 END) AS Engineering,       
 4                 SUM(CASE WHEN d.Name = 'Marketing' THEN 1 ELSE 0 END) AS Marketing
 5 FROM    HumanResources.EmployeeDepartmentHistory h       
 6 INNER JOIN HumanResources.Department d            
 7 ON h.DepartmentID = d.DepartmentID       
 8 INNER JOIN HumanResources.Shift s         
 9 ON h.ShiftID = s.ShiftID
10 WHERE   h.EndDate IS NULL       
11 AND d.Name IN ('Production', 'Engineering', 'Marketing')
12 GROUP BY s.Name;

也是同樣結果

 

 

6.這兩種方法無論是用PIVOT關鍵字還是直接聚合運算都需要事先知道部門的名稱,因為必須要有列名,

這種情況可以先查詢一下部門,然后動態拼接進column_list ,但是這種動態拼接似乎用第二種方式無法實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM