如何在没有“非分组字段x”的情况下对“SUM”进行“HAVING”用于HAVING子句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有“非分组字段x”的情况下对“SUM”进行“HAVING”用于HAVING子句相关的知识,希望对你有一定的参考价值。
所以,我有这个查询,它在HeidiSQL中运行良好,但在Laravel中没有因为严格模式(更具体地说可能是因为设置了SQL模式ONLY_FULL_GROUP_BY
):
SELECT
project.id
'Project code',
SUM(report.hours)
'Total hours',
SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END)
'Total report hours'
FROM report
INNER JOIN project ON project.id = report.id
WHERE report.date <= :report_end
GROUP BY
project.id
HAVING
`Total report hours` != 0
它给了我以下错误:
语法错误或访问冲突:1463非分组字段“总报告小时数”用于HAVING子句
我试过在这里搜索,但是我发现的所有问题都是通过将过滤器从HAVING
移动到WHERE
来解决的,这可以完成,因为这些情况实际上并不包含聚合函数。但是,在我的情况下,确实如此,我认为这正是HAVING
的用途?即我想过滤掉报告期内没有任何小时数的所有行。
我可以“解决”它而不是引用Total report hours
,而是重复整个SUM
,像这样:
HAVING
SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END) != 0
但是当它已经被计算并且(从我的观点来看)在查询本身可用时,这感觉非常不必要和混乱。
那么,有没有一种方法可以表达这一点,它在严格模式下工作,而不必重复自己?
在某些数据库中,您需要复制聚合表达式:
SELECT p.id as 'Project code',
SUM(r.hours) as 'Total hours',
SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) as 'Total report hours'
FROM report r INNER JOIN
project p
ON p.id = r.id
WHERE r.date <= :report_end
GROUP BY p.id
HAVING SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) <> 0;
我建议你不要使用单引号作为列别名。您正在使用多个数据库,因此不清楚哪个转义字符最好 - 反引号,双引号或方括号。
当然,您也可以使用子查询。
将查询包装在派生表中。在顶级添加条件:
select *
from
(
SELECT
project.id
'Project code',
SUM(report.hours)
'Total hours',
SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END)
'Total report hours'
FROM report
INNER JOIN project ON project.id = report.id
WHERE report.date <= :report_end
GROUP BY
project.id
) dt
WHERE `Total report hours` != 0
我不知道哪个版本的mysql MariaDB 10.2是基于的,但至少在MySQL中,这是一个bug。它已在MySQL 5.7.5中修复。
- https://bugs.mysql.com/bug.php?id=51058
- http://mysqlserverteam.com/mysql-5-7-only_full_group_by-improved-recognizing-functional-dependencies-enabled-by-default/
MySQL manual甚至提到这个:
从MySQL 5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP_BY。 (在5.7.5之前,MySQL不检测功能依赖性,默认情况下不启用ONLY_FULL_GROUP_BY。
以上是关于如何在没有“非分组字段x”的情况下对“SUM”进行“HAVING”用于HAVING子句的主要内容,如果未能解决你的问题,请参考以下文章