如何在mysql中使用case stament计数

yeotifhr  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(303)

我有以下问题

  1. SELECT CASE u.situacionUsuario
  2. WHEN "A" THEN 'ALTA'
  3. WHEN "R" THEN 'ALTA'
  4. WHEN "S" THEN 'ALTA'
  5. WHEN "B" THEN 'BAJA'
  6. WHEN "T" THEN 'BAJA'
  7. ELSE NULL
  8. END AS Situacion
  9. FROM Usuario u
  10. WHERE
  11. YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
  12. GROUP BY u.situacionUsuario, u.usuario;

返回这个结果

  1. -Situacion-
  2. |ALTA |
  3. |ALTA |
  4. |ALTA |
  5. |ALTA |
  6. |ALTA |
  7. |ALTA |
  8. |BAJA |
  9. |BAJA |
  10. |ALTA |
  11. |ALTA |
  12. |ALTA |
  13. |BAJA |
  14. |ALTA |
  15. |ALTA |
  16. |ALTA |
  17. ----------

我想要的结果就是这个。

  1. -Situacion-TOTAL-|
  2. |ALTA |12 |
  3. |BAJA |3 |
  4. -----------------

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

  1. SELECT CASE u.situacionUsuario
  2. WHEN "A" THEN 'ALTA'
  3. WHEN "R" THEN 'ALTA'
  4. WHEN "S" THEN 'ALTA'
  5. WHEN "B" THEN 'BAJA'
  6. WHEN "T" THEN 'BAJA'
  7. ELSE NULL
  8. END AS Situacion,
  9. COUNT (CASE u.situacionUsuario
  10. WHEN "A" THEN 'ALTA'
  11. WHEN "R" THEN 'ALTA'
  12. WHEN "S" THEN 'ALTA'
  13. WHEN "B" THEN 'BAJA'
  14. WHEN "T" THEN 'BAJA'
  15. ELSE NULL
  16. END) AS Total
  17. FROM Usuario u
  18. WHERE
  19. YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
  20. GROUP BY Situacion;

有没有什么建议,我怎样才能和案件一起计算,并得到预期的结果?

iqjalb3h

iqjalb3h1#

尝试嵌入式选择,

  1. select Situacion, countSituacion from
  2. SELECT CASE u.situacionUsuario
  3. WHEN "A" THEN 'ALTA'
  4. WHEN "R" THEN 'ALTA'
  5. WHEN "S" THEN 'ALTA'
  6. WHEN "B" THEN 'BAJA'
  7. WHEN "T" THEN 'BAJA'
  8. ELSE NULL
  9. END AS Situacion
  10. FROM Usuario u
  11. WHERE
  12. YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
  13. group by Situacion;
7gyucuyw

7gyucuyw2#

做那件事 CASE 派生表中的部分。 GROUP BY 其结果:

  1. select Situacion, count(*) as TOTAL
  2. from
  3. (
  4. SELECT CASE u.situacionUsuario
  5. WHEN "A" THEN 'ALTA'
  6. WHEN "R" THEN 'ALTA'
  7. WHEN "S" THEN 'ALTA'
  8. WHEN "B" THEN 'BAJA'
  9. WHEN "T" THEN 'BAJA'
  10. ELSE NULL
  11. END AS Situacion
  12. FROM Usuario u
  13. WHERE
  14. YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
  15. ) dt
  16. GROUP BY Situacion
展开查看全部
wf82jlnq

wf82jlnq3#

我会这样写:

  1. SELECT (CASE u.situacionUsuario
  2. WHEN 'A' THEN 'ALTA'
  3. WHEN 'R' THEN 'ALTA'
  4. WHEN 'S' THEN 'ALTA'
  5. WHEN 'B' THEN 'BAJA'
  6. WHEN 'T' THEN 'BAJA'
  7. END) AS Situacion,
  8. COUNT(*) AS Total
  9. FROM Usuario u
  10. WHERE u.fechaAsistencia >= '2018-01-01' AND
  11. u.fechaAsistencia < '2019-01-01'
  12. GROUP BY Situacion;

笔记:
字符串应该用单引号分隔。例如,如果 Usuario 有任何列被命名为 A 或者 R 等等。
在中使用直接日期比较,而不是日期函数 WHERE 条款,如果可能的话。这改进了优化。
mysql在 GROUP BY .
我不知道你为什么要 0 如果行是 NULL ,所以这只是使用 COUNT(*) 总的来说。 ELSE NULL 是多余的。我不认为这会增加任何疑问。
我其实可以简化为:

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

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

展开查看全部

相关问题