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 ,但是這種動態拼接似乎用第二種方式無法實現