【问题标题】:SQL select case when and groupSQL 选择 case when 和 group
【发布时间】:2021-09-15 12:54:27
【问题描述】:

我有这张桌子

我想按年龄分组并统计性别类型

这个案例:

age <= 20 then 'Group <= 20'
age between 21-40 then 'Group 21-40'
age between 41-60 then 'Group 41-60'
age > 60 then 'Group > 60'

我已经尝试过这段代码,但出现错误:

%%sql
select customer_id, birthdate, extract('year' from current_date) - extract('year' from birthdate ) age
case when age <= 20 then 'Group <= 20'
when age between 21 and 40 then 'Group 21 - 40'
when age between 41 and 60 then 'Group 41 - 60'
else 'Group > 60' end gender
from dim_customer 
group by 1

有什么解决办法吗?提前致谢。

顺便说一句:我在 Python 中使用此代码

【问题讨论】:

    标签: postgresql case grouping


    【解决方案1】:

    在 SELECT 中不使用别名列,但在 GROUP BY 和 ORDER BY 子句中使用。

    -- PostgreSQL
    SELECT t.*
         , CASE WHEN age <= 20 THEN 'Group <= 20'
                WHEN age BETWEEN 21 AND 40 THEN 'Group 21 - 40'
                WHEN age BETWEEN 41 AND 60 THEN 'Group 41 - 60'
                ELSE 'Group > 60' END gender 
    FROM (SELECT customer_id, birthdate
               , extract('year' from current_date) - extract('year' from birthdate ) age
    from dim_customer) t
    

    请查看网址https://dbfiddle.uk/?rdbms=postgres_11&fiddle=38c6ba05adc779aed3063e490bcc6376

    注意:使用 date_part('year', current_timestamp :: DATE) - date_part('year',birthdate) 进行年龄计算。

    按组计算性别并使用别名

    SELECT CASE WHEN age <= 20 THEN 'Group <= 20'
                WHEN age BETWEEN 21 AND 40 THEN 'Group 21 - 40'
                WHEN age BETWEEN 41 AND 60 THEN 'Group 41 - 60'
                ELSE 'Group > 60' END gender
            , COUNT(t.gender) count_gender
            , COUNT(CASE WHEN t.gender = 'M' THEN 1 END) gen_male
            , COUNT(CASE WHEN t.gender = 'F' THEN 1 END) gen_female
    FROM (SELECT customer_id, birthdate, gender
               , extract('year' from current_date) - extract('year' from birthdate ) age
               , date_part('year', current_timestamp :: DATE) - date_part('year', birthdate) age1
    from dim_customer) t
    GROUP BY CASE WHEN age <= 20 THEN 'Group <= 20'
                WHEN age BETWEEN 21 AND 40 THEN 'Group 21 - 40'
                WHEN age BETWEEN 41 AND 60 THEN 'Group 41 - 60'
                ELSE 'Group > 60' END
    

    请查看网址https://dbfiddle.uk/?rdbms=postgres_11&fiddle=ad8af9dd9b82ede20452377615ca7fde

    【讨论】:

    • 非常感谢您的回答,无论如何,每个年龄段的性别如何计算?
    • 统计男性,女性在不同的列
    • upss,对不起,谢谢你帮助我希望你有一个美好的一天:D
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2015-07-21
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多