代码之家  ›  专栏  ›  技术社区  ›  anon_swe

SQL:根据多个条件计算行数,单个查询

  •  3
  • anon_swe  · 技术社区  · 6 年前

    我有一个mysql表,其中有一个列名为 score 这是0-1之间的浮动。我要计算分数所在的行数:

    • 大于0.1
    • 大于0.3
    • 大于0.6
    • 大于0.95

    我可以运行这样的查询:

    SELECT COUNT(*)
    FROM my_table
    WHERE score > 0.1
    

    对每个值都这样做。不过,我想在一个查询中完成这项工作。因此,所需的输出格式如下:

    low, medium, high, very_high
    200   156    123       96
    

    有什么建议吗?我认为这涉及到 case when ,类似于:

    SELECT COUNT(*), 
           CASE WHEN score > 0.1 THEN "low"
           CASE WHEN score > 0.3 THEN "medium"
           CASE WHEN score > 0.6 THEN "high"
           CASE WHEN score > 0.95 THEN "very_high" end as score_group
    FROM my_table
    GROUP BY score_group
    

    但这并不能解释0.4分同时是“低”和“中”的事实,所以这并不完全正确。

    任何想法都会很棒的!

    2 回复  |  直到 6 年前
        1
  •  3
  •   GMB    6 年前

    您似乎在寻找条件聚合:

    SELECT 
        count(*) total,
        SUM(CASE WHEN score BETWEEN 0.1 AND 0.3  THEN 1 ELSE 0 END) low,
        SUM(CASE WHEN score BETWEEN 0.3 AND 0.6  THEN 1 ELSE 0 END) medium,
        SUM(CASE WHEN score BETWEEN 0.6 AND 0.95 THEN 1 ELSE 0 END) high,
        SUM(CASE WHEN score >= 0.95 THEN 1 ELSE 0 END) 'very_high'
    FROM my_table
    

    此查询将返回一行,显示分析的总行数和属于每个类别的行数。 col BETWEEN val1 AND val2 是的快捷方式 col >= val1 AND col < val2 .

        2
  •  1
  •   SomoKRoceS    6 年前

    你的方法非常接近,你可以在你的条件下使用。

    这就可以做到:

    SELECT COUNT(*),
    CASE WHEN score > 0.1 AND score <= 0.3 THEN "low"
    WHEN score > 0.3 AND score <= 0.6 THEN "medium"
    WHEN score > 0.6 AND score <= 0.95 THEN "high"
    WHEN score > 0.95 THEN "very_high"
    ELSE "very_low"
    END AS score_group
    FROM my_table
    GROUP BY score_group