【问题标题】:SQL multiple CASE WHEN with same Count functionSQL 多个 CASE WHEN 具有相同的 Count 函数
【发布时间】:2015-09-12 23:59:55
【问题描述】:

我有学生记录,我需要按年龄对他们进行分组。我有这种情况:

  • 如果年龄组只有一名成员,请显示他/她的姓名和性别
  • 其他
    • 将“某些字符串”显示为名称
    • 检查成员的性别,如果都是 FEMALE,则返回 FEMALE。如果都是 MALE,则返回 MALE,否则返回 MIX

我想出了这个查询

    SELECT Count(id) as GROUP_SIZE,
    CASE WHEN COUNT(id) = 1 THEN name ELSE 'SOME STRING' END as name,
    CASE WHEN COUNT(id) = 1 THEN sex ELSE (
       CASE WHEN COUNT(CASE WHEN sex = 'MALE' THEN 1 END) = 0 THEN 'FEMALE'
            WHEN COUNT(CASE WHEN sex = 'FEMALE' THEN 1 END) = 0 THEN 'MALE'
            ELSE 'MIX'
       END
    ) END as sex
    FROM students GROUP BY age                

此查询输出我想要的场景,但我多次调用 Count(id)。调用多个 Count 会影响性能吗?或者如果 Count(id) 被执行一次,那么它在后续调用 Count(id) 时是否有一个恒定的时间?我试过CASE WHEN GROUP_SIZE 但它不起作用。请告知我如何改进这一点。谢谢。

【问题讨论】:

    标签: mysql sql optimization query-optimization mariadb


    【解决方案1】:

    我不确定在 count(COLUMN) 方面优化 MySQL 的效果如何,但是如果您改用 count(1),您将获得(至少相同的)最佳性能。

    【讨论】:

    【解决方案2】:

    我希望它能够重用该值。当您使用GROUP BY 时,它必须将所有行收集到组中。保存组的数据结构可能在一个元素中具有组的大小,因此它不必进行任何实际计数,它是在创建组的过程中完成的。

    【讨论】:

      【解决方案3】:

      可能对性能影响不大,但看看感觉如何:

      SELECT  age,   -- (I think you forgot this)
              GROUP_SIZE,
              IF (GROUP_SIZE = 1, a_name, 'SOME STRING) AS name,
              IF (min_sex = max_sex, max_sex, 'MIX') AS sex
          FROM  
            ( SELECT  COUNT(*) AS GROUP_SIZE,
                      MAX(name) AS a_name,
                      MAX(sex) AS max_sex,
                      MIN(sex) AS min_sex,
                  FROM  students
                  GROUP BY  age 
            ) z
          ORDER BY  age;   -- (you probably wanted this)
      

      COUNT(*) 是正常模式。 COUNT(x) 检查 x 是否为 NULL 并且不计算它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        相关资源
        最近更新 更多