Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当值来自case语句时,无法将列中的值分组为相等值_Mysql_Sql - Fatal编程技术网

Mysql 当值来自case语句时,无法将列中的值分组为相等值

Mysql 当值来自case语句时,无法将列中的值分组为相等值,mysql,sql,Mysql,Sql,这是我创建的一个视图 SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(c.date_of_birth) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(c.date_of_birth, 5)) as age, count(a.id) as occurences, a.celex_id, COUNT(CASE WHEN c.gender = 'MALE' THEN c.id END) as males, COUNT(CASE WHE

这是我创建的一个视图

SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(c.date_of_birth) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(c.date_of_birth, 5)) as age, count(a.id) as occurences, a.celex_id,

COUNT(CASE WHEN c.gender = 'MALE' THEN c.id END) as males,
COUNT(CASE WHEN c.gender = 'FEMALE' THEN c.id END) as females,
COUNT(CASE WHEN c.gender IS NULL THEN c.id END) as unknowns

FROM consumer c, account a

WHERE a.consumer_id = c.id

GROUP BY age, a.celex_id;
等等

现在,我用case语句进行了一个查询,但我无法按案例进行分组,这就是查询

SELECT
CASE
    WHEN age BETWEEN 0  AND 10 THEN '0-10'
    WHEN age BETWEEN 11 AND 20 THEN '11-20'
    WHEN age BETWEEN 21 AND 30 THEN '21-30'
    WHEN age BETWEEN 31 AND 40 THEN '31-40'
    WHEN age BETWEEN 41 AND 50 THEN '41-50'
    WHEN age BETWEEN 51 AND 60 THEN '51-60'
    WHEN age BETWEEN 61 AND 70 THEN '61-70'
    WHEN age BETWEEN 71 AND 80 THEN '71-80'
    WHEN age BETWEEN 81 AND 90 THEN '81-90'
    WHEN age BETWEEN 91 AND 100 THEN '91-100'
    WHEN age > 100 THEN 'Greater than 100'
ELSE 'Unknown'
END AS age_range, males, females, unknowns
FROM age_gender_occurences
WHERE celex_id = 1
GROUP BY age_range, males, females, unknowns
这给

age_range | males | females | unknowns
--------------------------------------
11-20     | 0     | 1       | 0
21-30     | 0     | 1       | 0
61-70     | 0     | 1       | 0
61-70     | 1     | 0       | 0
61-70     | 0     | 0       | 1

我已经尝试在GROUPBY子句中直接复制case语句,但这不起作用。有人能告诉我如何让年龄范围成为一行吗?(如61-70变为1行而不是3行)

您缺少聚合函数。我会根据原始表格来写:

SELECT (CASE WHEN age BETWEEN 0  AND 10 THEN '0-10'
             WHEN age BETWEEN 11 AND 20 THEN '11-20'
             WHEN age BETWEEN 21 AND 30 THEN '21-30'
             WHEN age BETWEEN 31 AND 40 THEN '31-40'
             WHEN age BETWEEN 41 AND 50 THEN '41-50'
             WHEN age BETWEEN 51 AND 60 THEN '51-60'
             WHEN age BETWEEN 61 AND 70 THEN '61-70'
             WHEN age BETWEEN 71 AND 80 THEN '71-80'
             WHEN age BETWEEN 81 AND 90 THEN '81-90'
             WHEN age BETWEEN 91 AND 100 THEN '91-100'
             WHEN age > 100 THEN 'Greater than 100'
             ELSE 'Unknown'
         END) AS age_range,
        SUM(CASE WHEN c.gender = 'MALE' THEN 1 ELSE 0 END) as males,
        SUM(CASE WHEN c.gender = 'FEMALE' THEN 1 ELSE 0 END) as females,
        SUM(CASE WHEN c.gender IS NULL THEN 1 ELSE 0 END) as unknowns
FROM consumer c JOIN
     account a
     ON a.consumer_id = c.id
WHERE celex_id = 1
GROUP BY age_range;
如果您想从视图的角度来编写它(这似乎有些过分):


换句话说,您需要再次聚合。事实上,在这种情况下,MySQL将进行两次聚合,这就是为什么我推荐只使用原始表的更简单版本。

您的查询中有一些错误,但当我解决这些问题时,我得到了正确的结果,谢谢@丹尼尔。您可以修复答案,也可以让我知道错误是什么。了解
分组方式的工作原理<代码>按x、y、z分组
表示“我希望每个x/y/z组合有一个结果行”。您希望每个年龄范围有一个结果行,因此您只能相应地按年龄范围分组。
SELECT (CASE WHEN age BETWEEN 0  AND 10 THEN '0-10'
             WHEN age BETWEEN 11 AND 20 THEN '11-20'
             WHEN age BETWEEN 21 AND 30 THEN '21-30'
             WHEN age BETWEEN 31 AND 40 THEN '31-40'
             WHEN age BETWEEN 41 AND 50 THEN '41-50'
             WHEN age BETWEEN 51 AND 60 THEN '51-60'
             WHEN age BETWEEN 61 AND 70 THEN '61-70'
             WHEN age BETWEEN 71 AND 80 THEN '71-80'
             WHEN age BETWEEN 81 AND 90 THEN '81-90'
             WHEN age BETWEEN 91 AND 100 THEN '91-100'
             WHEN age > 100 THEN 'Greater than 100'
             ELSE 'Unknown'
         END) AS age_range,
        SUM(CASE WHEN c.gender = 'MALE' THEN 1 ELSE 0 END) as males,
        SUM(CASE WHEN c.gender = 'FEMALE' THEN 1 ELSE 0 END) as females,
        SUM(CASE WHEN c.gender IS NULL THEN 1 ELSE 0 END) as unknowns
FROM consumer c JOIN
     account a
     ON a.consumer_id = c.id
WHERE celex_id = 1
GROUP BY age_range;
SELECT (CASE WHEN age BETWEEN 0  AND 10 THEN '0-10'
             WHEN age BETWEEN 11 AND 20 THEN '11-20'
             WHEN age BETWEEN 21 AND 30 THEN '21-30'
             WHEN age BETWEEN 31 AND 40 THEN '31-40'
             WHEN age BETWEEN 41 AND 50 THEN '41-50'
             WHEN age BETWEEN 51 AND 60 THEN '51-60'
             WHEN age BETWEEN 61 AND 70 THEN '61-70'
             WHEN age BETWEEN 71 AND 80 THEN '71-80'
             WHEN age BETWEEN 81 AND 90 THEN '81-90'
             WHEN age BETWEEN 91 AND 100 THEN '91-100'
             WHEN age > 100 THEN 'Greater than 100'
             ELSE 'Unknown'
         END) AS age_range,
        SUM(males) as males,
        SUM(females) as females,
        SUM(unknowns) as unknowns
FROM age_gender_occurences
WHERE celex_id = 1
GROUP BY age_range;