2017-10-16 104 views
2

有沒有辦法在SQL Server 2008中將結果從水平轉換爲垂直?轉置計數從水平到垂直

例如,我在下面有下面的查詢。

Select 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID) AS JobTotal, 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID and Status = 'Completed') AS JobTCompleted, 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID and Status = 'Expried') AS JobExpired 
FROM tblEmployee e 

然後該查詢產生下面的結果:

RecID JobTotal JobCompleted JobExpired 
1574 167   56    167 
1621 216   85    215 
1676 8   2    5 

我想從該結果到垂直格式如下樣品轉置。

RecID Category FieldName  Value 
1574 Job   JobTotal  167 
1574 Job   JobCompleted 56 
1574 Job   JobExpired  167 
1621 Job   JobTotal  216 
1621 Job   JobCompleted 85 
1621 Job   JobExpired  215 
1676 Job   JobTotal  8 
1676 Job   JobCompleted 2 
1676 Job   JobExpired  5 

請指教(如有可能,帶示例代碼)。在此先感謝

回答

2

你會發現這個性能會更好,因爲它避免了重複聚集一招。

WITH J 
    AS (SELECT JobOwnerID, 
       COUNT(*) AS JobTotal, 
       COUNT(CASE 
         WHEN Status = 'Completed' THEN 1 
         END) AS JobTCompleted, 
       COUNT(CASE 
         WHEN Status = 'Expried' THEN 1 
         END) AS JobExpired 
     FROM tblJob 
     GROUP BY JobOwnerID) 
SELECT e.RecID, 
     v.FieldName, 
     ISNULL(Value, 0) AS Value 
FROM tblEmployee e 
     LEFT JOIN J 
       ON J.JobOwnerID = E.EmployeeID 
     CROSS APPLY (VALUES ('JobTotal', JobTotal), 
          ('JobCompleted', JobTCompleted), 
          ('JobExpired', JobExpired)) V(FieldName, Value) 
+0

謝謝@Martin,你的解決方案效果很好(雖然它對我來說很複雜:)) – Milacay

1

下面是使用Outer Apply

SELECT RecID, 
     Category, 
     FieldName, 
     Count(FieldName) 
FROM tblEmployee e 
     Left join tblJob t on t.JobOwnerID = e.EmployeeID 
     Outer apply (SELECT 'JobTCompleted' WHERE Status = 'Completed' 
        UNION ALL 
        SELECT 'JobExpired' WHERE Status = 'JobExpired' 
        UNION ALL 
        SELECT 'JobTotal') cs (FieldName) 
Group By RecID, 
     Category, 
     FieldName 
+0

您需要將「FROM tblJob Where JobOwnerID = e.EmployeeID」添加到交叉應用中的每個查詢中。 –

+0

@SeanLange - 不需要。許多人不知道這個語法實際上存在 –

+1

怎麼可能不需要它。在原來的職位,他們需要從tblJob計數,而不是tblEmployee –

1

您可以將您從原始查詢中獲得的結果數據集取消轉換。

;WITH RESULT_TABLE AS 
(Select e.RecID 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID) AS JobTotal, 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID and Status = 'Completed') AS JobTCompleted, 
(Select Count(*) FROM tblJob Where JobOwnerID = e.EmployeeID and Status = 'Expried') AS JobExpired 
FROM tblEmployee e) 
SELECT RecID,[Option],[Value] 
FROM 
RESULT_TABLE 
UNPIVOT 
(
    [Value] FOR [Option] IN (JobTotal,JobCompleted,JobExpired) 
) AS unpivotTable; 
+1

這也是一個很好的解決方案。我嘗試過,它完美。非常感謝@Amit – Milacay