0

我正在处理如下表,表名是信息:

-------------------------------
|id | gender | country |  age | 
-------------------------------
| 1 |    F   | America |  18  |
-------------------------------
| 2 |    M   | America |  22  |
-------------------------------
| 3 |    M   |  Japan  |  30  |
-------------------------------
| 4 |    M   |  Brazil |  32  |
-------------------------------
| 5 |    F   |  Norway |  34  |
-------------------------------
| 7 |    M   | America |  32  |
-------------------------------
|10 |    F   |  Norway |  22  |
-------------------------------
|13 |    F   |  Japan  |  36  |
-------------------------------
|14 |    F   |  Brazil |  19  |
-------------------------------
|25 |    F   |  Japan  |  33  |
-------------------------------

我希望输出是:

------------------------------------------------------
| country |  total | Female | Male | 18 - 25 | 26 -35 |
------------------------------------------------------
| America |   3    |   1    |  2   |    2    |   1    |
------------------------------------------------------
|  Japan  |   3    |   2    |  1   |    0    |   3    |
------------------------------------------------------
|  Brazil |   2    |   1    |  1   |    1    |   1    |
------------------------------------------------------
|  Norway |   2    |   2    |  0   |    1    |   1    |
------------------------------------------------------

以下是我的方法,首先按国家和性别计算不同的 id 组:

SELECT country, gender, COUNT(DISTINCT id)  FROM information GROUP BY 1,2;

然后尝试创建具有年龄范围的表:

(SELECT '18-25' AS '18-25'
        SUM(CASE WHEN (AGE >=18 AND AGE<=25) THEN 1 ELSE 0 END) AS NUM FROM information)
UNION
(SELECT '26-35' AS '18-25'
        SUM(CASE WHEN (AGE >=26 AND AGE<=35) THEN 1 ELSE 0 END) AS NUM FROM information)

但我不确定如何组合它们并将列转换为行。谁能给我一些建议?

4

2 回答 2

0

使用条件聚合:

select country, count(*) as total,
       sum(case when gender = 'F' then 1 else 0 end) as num_female,
       sum(case when gender = 'M' then 1 else 0 end) as num_male,
       sum(case when age >= 18 and age <= 25 then 1 else 0 end) as age_18_25,
       sum(case when age >= 26 and age <= 35 then 1 else 0 end) as age_26_35
from information
group by country
于 2020-11-19T03:04:22.633 回答
0

我更喜欢 Gordon 的答案略有不同,因为它消除了对明确ELSE案例的需要:

SELECT
    country,
    COUNT(*) AS total,
    COUNT(CASE WHEN gender = 'F' THEN 1 END) AS Female,
    COUNT(CASE WHEN gender = 'M' THEN 1 END) AS Male,
    COUNT(CASE WHEN age BETWEEN 18 AND 25 THEN 1 END) AS "18-25",
    COUNT(CASE WHEN age BETWEEN 26 AND 35 THEN 1 END) AS "26-35"
FROM information
GROUP BY
    country;

更少的代码 = 通常是一件更好的事情

于 2020-11-19T03:06:02.663 回答