【问题标题】:How to COUNT in MySQL with CASE stament如何在 MySQL 中使用 CASE 语句进行计数
【发布时间】:2019-05-07 04:53:45
【问题描述】:

我有以下查询

SELECT CASE u.situacionUsuario 
    WHEN "A" THEN 'ALTA'
    WHEN "R" THEN 'ALTA'
    WHEN "S" THEN 'ALTA'
    WHEN "B" THEN 'BAJA'
    WHEN "T" THEN 'BAJA'
    ELSE NULL
    END AS Situacion
FROM Usuario u
WHERE 
YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
GROUP BY u.situacionUsuario, u.usuario;

返回这个结果

-Situacion-
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|BAJA     |
|BAJA     |
|ALTA     |
|ALTA     |
|ALTA     |
|BAJA     |
|ALTA     |
|ALTA     |
|ALTA     |
----------

我想要的结果就是这个。

-Situacion-TOTAL-|
|ALTA     |12    |
|BAJA     |3     |
-----------------

我使用了 COUNT,但它没有返回我想要的结果

SELECT CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END AS Situacion,
    COUNT (CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END) AS Total
    FROM Usuario u
    WHERE 
    YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
    GROUP BY Situacion;

任何建议我如何计算案例并获得所需的结果?

【问题讨论】:

    标签: mysql sql count case mysql-workbench


    【解决方案1】:

    在派生表中执行CASE 部分。 GROUP BY它的结果:

    select Situacion, count(*) as TOTAL
    from
    (
        SELECT CASE u.situacionUsuario 
            WHEN "A" THEN 'ALTA'
            WHEN "R" THEN 'ALTA'
            WHEN "S" THEN 'ALTA'
            WHEN "B" THEN 'BAJA'
            WHEN "T" THEN 'BAJA'
            ELSE NULL
            END AS Situacion
        FROM Usuario u
        WHERE 
        YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
    ) dt
    GROUP BY Situacion
    

    【讨论】:

    • count(*) as TOTAL?
    【解决方案2】:

    我会这样写:

    SELECT (CASE u.situacionUsuario 
               WHEN 'A' THEN 'ALTA'
               WHEN 'R' THEN 'ALTA'
               WHEN 'S' THEN 'ALTA'
               WHEN 'B' THEN 'BAJA'
               WHEN 'T' THEN 'BAJA'
            END) AS Situacion,
           COUNT(*) AS Total
    FROM Usuario u
    WHERE u.fechaAsistencia >= '2018-01-01' AND
          u.fechaAsistencia < '2019-01-01' 
    GROUP BY Situacion;
    

    注意事项:

    • 字符串应该用单引号分隔。您的代码将无法工作 - 例如 - 如果 Usuario 有任何名为 AR 的列等等。
    • 尽可能在WHERE 子句中使用直接日期比较而不是日期函数。这可以改善优化。
    • MySQL 支持 GROUP BY 中的列别名。
    • 如果行是NULL,我不知道你为什么要0,所以这里只使用COUNT(*)作为总数。
    • ELSE NULL 是多余的。我认为它不会向查询添加任何内容。

    我实际上会将其简化为:

    SELECT (CASE WHEN u.situacionUsuario IN ('A', 'R', 'S') THEN 'ALTA'
                 WHEN u.situacionUsuario IN ('B', 'T')  THEN 'BAJA'
            END) AS Situacion,
           COUNT(*) AS Total
    FROM Usuario u
    WHERE u.fechaAsistencia >= '2018-01-01' AND
          u.fechaAsistencia < '2019-01-01' 
    GROUP BY Situacion;
    

    这降低了查询中的 tpo 导致意外结果的可能性。

    【讨论】:

    • 感谢您的回答,您的解决方案为我提供了我正在寻找的方法
    【解决方案3】:

    尝试嵌入选择,

    select Situacion, count(Situacion) from (
    
    SELECT CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END AS Situacion
    FROM Usuario u
    WHERE 
    YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
    
    ) group by Situacion;
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2017-07-26
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      相关资源
      最近更新 更多