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技巧的人。