SQL - 为逆透视数据创建属性输出
SQL - create attribute output for unpivoted data
我有一个如下所示的数据集:
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
我想知道为什么创建数据集最有效?我是否必须对数据进行 PIVOT,然后将其 UNPIVOT 以创建我的最终数据集?或者有没有其他方法可以使用 CROSS APPLY 和 GROUP BY,我在这个论坛的其他帖子中看到过?
谢谢
这个问题比我最初想象的要棘手得多。我会在进行聚合后进行反透视:
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);
我有一个如下所示的数据集:
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
我想知道为什么创建数据集最有效?我是否必须对数据进行 PIVOT,然后将其 UNPIVOT 以创建我的最终数据集?或者有没有其他方法可以使用 CROSS APPLY 和 GROUP BY,我在这个论坛的其他帖子中看到过?
谢谢
这个问题比我最初想象的要棘手得多。我会在进行聚合后进行反透视:
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);