Mysql case when 和 order by issue

标签 mysql

有这样的查询:

SELECT
  count(*) as Total, 
  SUM(CASE WHEN gender = 1 then 1 ELSE 0 END) Male, 
  SUM(CASE WHEN gender = 2 then 1 ELSE 0 END) Female, 
  SUM(CASE WHEN gender = 0 then 1 ELSE 0 END) Unknown, 
  CASE 
    WHEN age>2 AND age<15 THEN '2-15' 
    WHEN age>18 AND age<25 THEN '18-25' 
  END AS var
FROM
  persons 
WHERE
  1=1 
  AND `date` > '2012-01-10'
  AND `date` < '2013-01-07' 
GROUP BY 
  CASE 
    WHEN age>2 AND age<15 THEN '2-15' 
    WHEN age>18 AND age<25 THEN '18-25'
  END

结果是:

Total Male  Female  Unknown var
29     17   12      0       NULL
7      0    7       0       18-25
3      0    3       0       2-15

第一个问题:
为什么结果是 NULL ?如何才能只显示带有值的结果?

第二个问题:
mysql 在 2-15 之前用 18-25 对我的 var 列进行排序,可能是因为数字 1 先出现然后是数字 2 . 但关键是作为数字的顺序,2 在前,然后是 18。

干杯:)

最佳答案

第一个回答:
它为 NULL,因为它不满足该年龄的任何 CASE 条件。像这样向 WHERE 添加一个子句应该可以做到:

WHERE (age > 2 AND age < 15) OR (age > 18 AND age < 25)

第二个答案:
你是对的,它是按字符串排序的(因为它们就是这样)。只需通过执行 ORDER ASCORDER DESC

更改排序方向

关于Mysql case when 和 order by issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14202326/

相关文章:

php - Laravel - 根据 Laravel 中相似的 id 对记录进行分组

c# - 我如何使用 2 个 sql 命令和 1 个阅读器?

php - 不区分大小写的MySQL搜索?

c# - C# 中的 mysqldump.exe 和 mysql.exe 访问

mysql - SQL排序: order blocks with DESC - but each block is sorted ASC within itself

值不相等时MySQL计数

php - 无法理解Mysql/php

mysql - Hibernate 查询比较日期(最多过去 10 个月)

mysql - 将2个表的数据复制到1个表

php - MySQL echo 具有相同 session ID 的记录数