2017-10-10 81 views
1

我有一個數據集看起來像下面這樣:SQL - 創建屬性輸出逆轉置數據

Position_Date Portfolio Country Weight BM Weight 
2017-09-30  Port1  Mexico 0.2  0.0 
2017-09-30  Port1  Mexico 0.1  0.1 
2017-09-30  Port1  USA  0.2  0.2 
2017-09-30  Port1  USA  0.3  0.1 

我想使用一個SQL查詢來改造這個存儲的數據設置成以下的輸出:

Portfolio_Date Portfolio Dimension  Dimension_Value Measure Measure_Value 
2017-09-30  Port1  Country   Mexico   Weight  0.3 
2017-09-30  Port1  Country   Mexico   BM Weight 0.1 
2017-09-30  Port1  Country   USA    Weight  0.5 
2017-09-30  Port1  Country   USA    BM Weight 0.3 
2017-09-30  Port1  Portfolio  Country   Weight  0.8 
2017-09-30  Port1  Portfolio  Country   BM Weight 0.4 

我想知道爲什麼要創建數據集有效嗎?我是否需要將數據插入纔可以將它釋放以創建我的最終數據集?或者有另一種方法使用CROSS APPLY和GROUP BY,我可以在這個論壇的其他帖子中看到這些使用情況?

謝謝

回答

1

這個問題比我第一次想到的要複雜得多。做聚合後我會做逆透視:

select t.Portfolio_Date, t.Portfolio, 
     v.* 
from (select t.Portfolio_Date, t.Portfolio, 
      coalesce(country, 'Country') as dimension_value, -- coalesce is a shortcut for getting the aggregated row 
      coalesce(country, 'Portfolio') as dimension, 
      sum(weight) as weight, sum(bm_weight) as bm_weight 
     from t 
     group by grouping sets ((t.Portfolio_Date, t.Portfolio, country), (t.Portfolio_Date, t.Portfolio)) 
    ) t outer apply 
    (values (dimension, dimension_value, 'Weight', weight), 
      (dimension, dimension_value, 'BM Weight', bm_weight) 
    ) v(dimension, dimension_value, measure, measure_value); 
+0

感謝在正確的方向@Gordon Linoff –

+0

只是想知道一點,如果你能向我解釋,你對COALESCE是用於獲取彙總行的快捷方式有何評論? @Gordon Linoff –

+1

@chrissyp。 。 。 'grouping sets'返回聚合行的NULL值。當然,原來的鍵可能已經有了'NULL',所以它是一個hacky(但非常方便)的解決方案。正確的方法是使用'grouping()',但這需要一個'case'。 –