简体   繁体   English

SQL 百分比 - 条件总和

[英]SQL Percentage - Conditional Sum

I want to calculate percentage churn and retain values according to app language.我想根据应用语言计算流失百分比并保留值。 I am using Snowflake.我正在使用雪花。

My current is as follows:我目前的情况如下:

SELECT i.language, lb.churn_status, SUM(lb.total_users) AS user_count
FROM level_based_churn_retain_comparison AS lb
    INNER JOIN sessions AS s
    ON s.level_index=lb.level_index
        INNER JOIN installs AS i
        ON s.user_id=i.user_id

GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count

And the output is输出是

language churn_status user_count

So with this very imaginative data (that I have in a CTE to make it easy for me)因此,有了这个非常有想象力的数据(我在 CTE 中拥有的数据让我很容易)

with level_based_churn_retain_comparison(level_index, total_users, churn_status) as (
    select * from values
    (10, 100, 'a'),
    (20, 400, 'a'),
    (30, 300, 'a')
), installs(user_id, language) as (
    select * from values
    (1, 'en'),
    (2, 'en'),
    (3, 'fr')
), sessions(user_id, level_index) as (
    select * from values
    (1, 10),
    (2, 20),
    (3, 30)
)

your SQL + RATIO_TO_REPORT你的 SQL + RATIO_TO_REPORT

SELECT 
    i.language, 
    lb.churn_status, 
    SUM(lb.total_users) AS user_count,
    100.0 * ratio_to_report(user_count) over() as percent_churn
FROM level_based_churn_retain_comparison AS lb
INNER JOIN sessions AS s
    ON s.level_index = lb.level_index
INNER JOIN installs AS i
    ON s.user_id = i.user_id
GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count

we get:我们得到:

LANGUAGE CHURN_STATUS CHURN_STATUS USER_COUNT USER_COUNT PERCENT_CHURN PERCENT_CHURN
en zh a一个 500 500 62.5 62.5
fr FR a一个 300 300 37.5 37.5

Now if you want the percentage to be per churn_status, we can put that into the PARTITION BY clause, like so:现在,如果您希望百分比为每个 churn_status,我们可以将其放入 PARTITION BY 子句中,如下所示:

with level_based_churn_retain_comparison(level_index, total_users, churn_status) as (
    select * from values
    (10, 100, 'a'),
    (20, 400, 'b'),
    (30, 300, 'a')
), installs(user_id, language) as (
    select * from values
    (1, 'en'),
    (2, 'en'),
    (3, 'fr')
), sessions(user_id, level_index) as (
    select * from values
    (1, 10),
    (2, 20),
    (3, 30)
)
SELECT 
    i.language, 
    lb.churn_status, 
    SUM(lb.total_users) AS user_count,
    100.0 * ratio_to_report(user_count) over(partition by lb.churn_status) as percent_churn
FROM level_based_churn_retain_comparison AS lb
INNER JOIN sessions AS s
    ON s.level_index = lb.level_index
INNER JOIN installs AS i
    ON s.user_id = i.user_id
GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count

giving:给予:

LANGUAGE CHURN_STATUS CHURN_STATUS USER_COUNT USER_COUNT PERCENT_CHURN PERCENT_CHURN
en zh a一个 100 100 25 25
en zh b b 400 400 100 100
fr FR a一个 300 300 75 75

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM