2016-06-08 34 views
1

我有这样的表。在SQL Server中有多个字段的数据透视表

|DateID  |DivisionCode | TransactionIn| TransactionOut| OutstandingTransaction| 
----------------------------------------------------------------------------------- 
|2016-01-01 |ENP   | 10   | 10   | 0      | 
|2016-08-01 |PA   | 2   | 0    | 2      | 
|2016-08-08 |MD   | 3   | 3    | 0      | 

我使用它来获取每个月的总TransactionIn,TransactionOut和OutstandingTransaction。

;WITH MissingMonths 
AS 
    (
     SELECT number 
     FROM master..spt_values 
     WHERE number > 0 AND number < 13 
     GROUP BY number 
    ), 
RPT_POApproval 
AS (
     SELECT 
     MONTH(RPT.DateID) as DateID, 
     SUM(RPT.TransactionIn) as TransactionIn, 
     SUM(RPT.TransactionOut) as TransactionOut, 
     SUM(RPT.OutstandingTransaction) as OutstandingTransaction 
     FROM RPT_SummaryPOApproval RPT 
     WHERE RPT.Deleted = 0 
     GROUP BY MONTH(DateID) 
    ) 

SELECT COALESCE(number,DateID) AS Month 
     ,COALESCE(TransactionIn, 0) AS TransactionIn 
     ,COALESCE(TransactionOut, 0) AS TransactionOut 
     ,COALESCE(OutstandingTransaction, 0) AS OutstandingTransaction 
FROM MissingMonths MM 
LEFT JOIN RPT_POApproval R ON MM.number = R.DateID 

所以它看起来像这样

|Month | TransactionIn| TransactionOut| OutstandingTransaction| 
------------------------------------------------------------------- 
|1  | 12   | 10   | 2      | 
|2  | 0   | 0    | 0      | 
|3  | 0   | 0    | 0      | 
|4  | 0   | 0    | 0      | 
|5  | 0   | 0    | 0      | 
|6  | 0   | 0    | 0      | 
|7  | 0   | 0    | 0      | 
|8  | 3   | 3    | 0      | 
|9  | 0   | 0    | 0      | 
|10 | 0   | 0    | 0      | 
|11 | 0   | 0    | 0      | 
|12 | 0   | 0    | 0      | 

我怎样才能使用枢这样的数据看起来是这样的结果呢?

|1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |12 | 
----------------------------------------- 
|12|0 |0 |0 |0 |0 |0 |3 |0 |0 |0 |0 | >> It's for Transaction In 
|10|0 |0 |0 |0 |0 |0 |3 |0 |0 |0 |0 | >> It's for Transaction Out 
|2 |0 |0 |0 |0 |0 |0 |3 |0 |0 |0 |0 | >> It's for Outstanding Trans 

回答

0

首先UNPIVOT然后PIVOT :)

;WITH cte AS (
SELECT COALESCE(number,DateID) AS Month 
     ,COALESCE(TransactionIn, 0) AS TransactionIn 
     ,COALESCE(TransactionOut, 0) AS TransactionOut 
     ,COALESCE(OutstandingTransaction, 0) AS OutstandingTransaction 
FROM MissingMonths MM 
LEFT JOIN RPT_POApproval R ON MM.number = R.DateID 
) 

SELECT * 
FROM (
    SELECT [Month], [Transactions], [Values] 
    FROM (
     SELECT * 
     FROM cte 
    ) as p 
    UNPIVOT (
     [Values] FOR [Transactions] IN (TransactionIn, TransactionOut, OutstandingTransaction) 
    ) as unpvt 
) as k 
PIVOT (
    MAX([Values]) FOR [Month] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
) as pvt 

输出:

Transactions   1 2 3 4 5 6 7 8 9 10 11 12 
TransactionIn   12 0 0 0 0 0 0 3 0 0 0 0 
TransactionOut   10 0 0 0 0 0 0 3 0 0 0 0 
OutstandingTransaction 2 0 0 0 0 0 0 0 0 0 0 0 
+0

哇谢谢你救我的一天:) – Arina

+0

欢迎您:) – gofr1