【问题标题】:SQL - create attribute output for unpivoted dataSQL - 为未透视数据创建属性输出
【发布时间】:2017-10-10 15:28:48
【问题描述】:

我有一个如下所示的数据集:

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

我想知道创建数据集的有效方法是什么?我是否必须先透视数据,然后再对其进行 UNPIVOT 以创建我的最终数据集?或者是否有另一种使用 CROSS APPLY 和 GROUP BY 的方法,我可以使用我在这个论坛的其他帖子中看到的?

谢谢

【问题讨论】:

    标签: sql sql-server pivot unpivot 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);
    

    【讨论】:

    • 只是想知道您是否可以向我解释您对 COALESCE 是获取聚合行的快捷方式的评论? @戈登林诺夫
    • @chrissyp 。 . . grouping sets 返回聚合行的 NULL 值。当然,原始密钥可能已经有NULL,所以这是一个hacky(但非常方便)的解决方案。正确的方法是使用grouping(),但这需要case
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2020-08-18
    • 2021-01-19
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多