【问题标题】:SQL ORACLE: group by column, get counts from other column depending on different where clausesSQL ORACLE:按列分组,根据不同的where子句从其他列获取计数
【发布时间】:2016-11-09 02:23:22
【问题描述】:

我会举例说明: 假设我有一个这样的数据集:

id | city   |  age   | gender
1  | London |   Y    |   M
2  | Milan  |   Y    |   F
3  | London |   O    |   M
4  | London |   O    |   F

我想为每个城市设置一行,一个用于伦敦,一个用于米兰。

在每一行中,我需要为其中的每一个设置一列:

  • 每个城市的条目总数
  • 每个城市的年轻人总数(年龄 = Y)
  • 每个城市的老年人总数(年龄 = O)
  • 每个城市的男性总人数(性别 = M)
  • 每个城市的女性总人数(性别 = F)。

最终结果应该是这样的:

city   | n_id   n_Y   n_O   n_M   n_F
---------------------------------------
London | 3      1     2     2     1
Milan  | 1      1     0     0     1

任何帮助都会很棒。

编辑:到目前为止我有

SELECT city, COUNT(id) FROM tablename GROUP BY city

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    使用条件聚合:

    select city, count(*) as n_id,
           sum(case when age = 'Y' then 1 else 0 end) as n_Y,
           sum(case when age = 'O' then 1 else 0 end) as n_O,
           sum(case when gender = 'M' then 1 else 0 end) as n_M,
           sum(case when gender = 'F' then 1 else 0 end) as n_F
    from t
    group by city;
    

    【讨论】:

    • 非常感谢!不知道“案例”。我会在 2 分钟内接受答案 :)
    • @Dubraven93 - 所以,请阅读 CASE 表达式(它有两种相似但略有不同的形式);然后,通读本网站上许多问题的答案,看看它有多灵活。它在您的示例中的 SELECT 子句中使用,在 WHERE 条件中,在 GROUP BY 和 ORDER BY.... 工具箱中拥有的超级方便的工具!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多