2017-10-10 16 views
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 
:

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 쿼리를 사용하여 다음과 같은 출력으로 설정이 저장된 데이터를 변환하고 싶습니다

데이터 세트를 만드는 것이 왜 효율적인지 궁금합니다. 최종 데이터 세트를 만들기 위해 데이터를 PIVOT해야합니까? 아니면이 포럼의 다른 게시물에서 본 적이있는 GROUP BY와 함께 CROSS APPLY를 사용하는 또 다른 방법이 있습니까?

감사

답변

1

이 질문은 내가 처음 생각했던 것보다 훨씬 까다 롭습니다. 나는 집계를 수행 한 후 UNPIVOT 할 것 :

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

그냥 궁금 올바른 방향으로 지점에 대한 당신이 나에게 유착이 집계 된 행을 취득하기위한 바로 가기 인에 대한 의견을 설명 할 수 있다면? @Gordon Linoff –

+1

@chrissyp. . . 'grouping sets'은 집계 행에 대해'NULL' 값을 반환합니다. 물론 원래의 키는 이미 'NULL'을 가질 수 있으므로 해킹 된 (그러나 매우 편리한) 솔루션입니다. 올바른 방법은'grouping()'을 사용하는 것이지만, 그것은'case'를 필요로합니다. –