SQL выберите случай, когда и группа

#postgresql #case #grouping

Вопрос:

У меня есть этот стол

https://i.stack.imgur.com/M0CIa.png

Я хочу сгруппировать по возрасту с учетом случая и подсчитать половой тип

Это дело:

 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

Ответ №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
 

Пожалуйста, проверьте по URL https://dbfiddle.uk/?rdbms=postgres_11amp;fiddle=38c6ba05adc779aed3063e490bcc6376

N. B.: Используйте date_part(‘год’, отметка текущего времени :: ДАТА) — date_part(‘год’, дата рождения) для расчета возраста.

Подсчитайте пол и используйте псевдоним в группе по разделам

 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
 

Пожалуйста, проверьте по URL https://dbfiddle.uk/?rdbms=postgres_11amp;fiddle=ad8af9dd9b82ede20452377615ca7fde

Комментарии:

1. большое вам спасибо за ответ, в любом случае, как посчитать пол в каждой возрастной группе?

2. посчитайте мужчин, женщин в разных столбцах

3. @Napier если мой ответ поможет вам, пожалуйста, отметьте его как принятый (зеленая галочка) вместе с голосованием, чтобы любой мог выбрать это без каких-либо сомнений.

4. upss, в любом случае извини, спасибо, что помог мне, надеюсь, у тебя будет хороший день 😀