2017-10-16 21 views
2

SQL Server 2008では結果を水平から垂直へ転置する方法はありますか?横置きから縦書きへの転置数

たとえば、私は以下の質問を以下に示します。私はサンプル以下のように垂直なフォーマットにその結果から移調したい

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

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 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

を使用して1つのトリックです。

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

関連する問題