sql—透视表的有效方法

bwitn5fc  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(307)

我有一个名为monthly\u agg的表,其中包含每月聚合的数据。

+------------+-----+----------+-----------+---------------+--------------+-------------+----------+---------+
| yyyy_mm_dd | id  | app      | ex_status | active_status | active_count | active_base | ex_count | ex_base |
+------------+-----+----------+-----------+---------------+--------------+-------------+----------+---------+
| 2019-01-31 | 123 | content  | impl      | impl          | 390          | 321         | 344      | 340     |
+------------+-----+----------+-----------+---------------+--------------+-------------+----------+---------+
| 2019-01-31 | 333 | messages | impl      | impl          | 541          | 210         | 788      | 610     |
+------------+-----+----------+-----------+---------------+--------------+-------------+----------+---------+
| 2019-01-31 | 832 | photos   | no        | no            | null         | 430         | null     | 100     |
+------------+-----+----------+-----------+---------------+--------------+-------------+----------+---------+

我想让每个应用,成为一个专栏。每个应用程序列应包含一个百分比,计算如下:

SELECT 
    yyyy_mm_dd,
    id,
   App,
    SUM(CASE
        WHEN (app = ‘content’ AND ex_status = ‘impl’) THEN ex_count/ex_base
        WHEN (active_status = 'impl') THEN active_count/active_base
    END) AS percentage
FROM 
    monthly_agg

我每个都要 app 值为列,然后该列的值为上述计算的结果。我怎么能这样转动table呢?理想情况下,我的输出如下所示:

+------------+-----+--------------------+---------------------+
| yyyy_mm_dd | id  | content_percentage | messages_percentage |
+------------+-----+--------------------+---------------------+
| 2019-01-31 | 123 | 1.2                | null                |
+------------+-----+--------------------+---------------------+
| 2019-01-31 | 333 | null               | 2.57                |
+------------+-----+--------------------+---------------------+

我有大约20个应用程序,所以动态将是伟大的。

cbjzeqam

cbjzeqam1#

iiuc您可以尝试:

SELECT 
    yyyy_mm_dd,
    id,
    SUM(CASE WHEN (app = 'content' AND ex_status = 'impl') THEN ex_count/ex_base 
WHEN (app = 'content' and active_status = 'impl') THEN active_count/active_base ELSE 0 END) AS content_percentage,
    SUM(CASE WHEN (app = 'messages' and active_status = 'impl') THEN active_count/active_base ELSE 0 END) AS messages_percentage
FROM 
    monthly_agg
GROUP BY
    yyyy_mm_dd, id

相关问题