2017-10-10 9 views
1

J'ai un ensemble de données qui ressemble à ce qui suit:SQL - Créer un attribut de sortie pour les données non pivoté

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 

je voudrais transformer ces données stockées définies dans la sortie suivante à l'aide d'une requête 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 

Je me demandais quelle serait la raison pour laquelle créer l'ensemble de données? Aurais-je besoin de PIVOTER les données pour ensuite les UNPIVOT pour créer mon ensemble de données final? Ou y a-t-il une autre façon d'utiliser CROSS APPLY avec un GROUP BY que je pourrais utiliser et que j'ai vu dans d'autres publications sur ce forum?

Merci

Répondre

1

Cette question est beaucoup plus délicat que je ne pensais d'abord. Je ferais le UNPIVOT après avoir fait l'agrégation:

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

Merci pour le point dans la bonne direction @Gordon Linoff –

+0

me demandais si vous pouviez me expliquer vos commentaires sur COALESCE étant un raccourci pour obtenir la ligne agrégée? @Gordon Linoff –

+1

@chrissyp. . . 'grouping sets' renvoie des valeurs' NULL' pour les lignes d'agrégation. Bien sûr, les clés d'origine pourraient déjà avoir 'NULL', donc c'est une solution hacky (mais très pratique). La bonne façon est d'utiliser 'grouping()', mais cela nécessite un 'case'. –