【问题标题】:How to transpose result?如何转置结果?
【发布时间】:2020-08-04 07:55:33
【问题描述】:

我有这个问题

Select week(date_time) week,
      sum(X1) as X1,
      sum(X2) as X2,
      sum(X3) as X3,
      sum(X4) as X4
From Fee
Where date_time between '2020-07-01' and current_date

我得到的结果如下:

week | X1 | X2 | X3 | X4
27   |
28   |
29   |
30   |
31   |

但我想将结果转置为:

week | 27 | 28 | 29 | 30 | 31
X1   |
X2   |
X3   |
X4   |

有人可以帮忙吗?

【问题讨论】:

    标签: sql transpose presto


    【解决方案1】:

    如果我理解了这个问题,您想取消透视数据并重新聚合:

    select v.x,
           sum(case when week(date_time) = 27 then 1 else 0 end) as week_27,
           sum(case when week(date_time) = 28 then 1 else 0 end) as week_28,
           sum(case when week(date_time) = 29 then 1 else 0 end) as week_29,
           sum(case when week(date_time) = 30 then 1 else 0 end) as week_30,
           sum(case when week(date_time) = 31 then 1 else 0 end) as week_31
    from fee f left join lateral
         (values (f.x1), (f.x2), (f.x3), (f.x4)) v(x)
    group by v.x
    

    Presto 也支持filter,所以这样写比较好:

    select v.x,
           count(*) filter (where week(date_time) = 27) as week_27,
           count(*) filter (where week(date_time) = 28) as week_28,
           count(*) filter (where week(date_time) = 29) as week_29,
           count(*) filter (where week(date_time) = 30) as week_30,
           count(*) filter (where week(date_time) = 31) as week_31
    from fee f left join lateral
         (values (f.x1), (f.x2), (f.x3), (f.x4)) v(x)
    group by v.x
    
      
    

    【讨论】:

    • 您可以使用过滤聚合:count() FILTER (WHERE week(date_time) = 27) AS week_27, ...。请参阅文档@prestosql.io/docs/current/functions/…
    • 非常感谢。 date_time 从 35 天前运行到当前日期是不可能的吗?因为你的代码,周时间是固定的。
    • @JJJJJ 。 . .那将是一个不同的问题。我认为这个问题很明显是关于固定日期的。
    猜你喜欢
    • 2021-07-21
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-09-13
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多