Sql 我应该如何组合多个列并转换为行?
我正在处理一个如下表,表名是信息:Sql 我应该如何组合多个列并转换为行?,sql,pivot-table,Sql,Pivot Table,我正在处理一个如下表,表名是信息: ------------------------------- |id | gender | country | age | ------------------------------- | 1 | F | America | 18 | ------------------------------- | 2 | M | America | 22 | ------------------------------- | 3 |
-------------------------------
|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)
但我不知道如何组合它们并将列转换为行。谁能给我一些建议吗?使用条件聚合:
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
Gordon的答案稍有不同,我更喜欢,因为它不需要明确的ELSE案例: 选择 国 把*算作总数, COUNTCASE当性别为'F'时,则1以女性结尾, COUNTCASE当性别为'M'时,则1以男性结尾, COUNTCASE当年龄在18到25岁之间时,则1结束为18到25岁, COUNTCASE当年龄在26到35岁之间时,则1结束为26到35岁 从信息 分组 国
更少的代码=通常更好用你正在使用的数据库标记你的问题。我会像Gordon那样使用sum这么长时间,但从未意识到你可以进行计数,因为它只会跳过空值。谢谢:D@T.Peter事实上,我很惊讶Gordon没有发布这个版本,我知道他的答案,因为Gordon通常是一个拥有上千个SQL技巧的人。