我正在尝试创建一个摘要输出,以根据子查询中的值显示总计,然后按标签对输出进行分组
查询如下:
select c.name,
(select sum(duration) from dates d
inner join time t1 on d.time_id=t1.id
where d.employee=t.employee
and d.date >= now() - INTERVAL 12 MONTH) as ad,
(select sum(cost) from dates d
inner join time t1 on d.time_id=t1.id
where d.employee=t.employee
and d.date >= now() - INTERVAL 12 MONTH) as ac
FROM time t
inner join employees ee on t.employee=ee.employee
inner join centres c on ee.centre=c.id
where
ee.centre in (4792,4804,4834) group by c.centre
我希望它向我显示每个中心的 ad 和 ac,但它只显示列表中最后一个中心的 ac 值,其余显示为零
如果我删除该组,那么我会得到所有条目的列表,但它不会以任何方式进行汇总,我需要该汇总 View
最佳答案
返回意外结果的 SQL 语句并不是一个完整的过程。
如果没有规范,没有用示例数据和预期输出来帮助说明,我们只是猜测查询应该实现的结果。
我认为问题的关键是为 GROUP BY
返回的 t.employee
的值,多个详细信息行具有各种 t 值对于
都会折叠成一行,并且 c.centre
的每个值,.employeet.employee
的值来自放。 (MySQL 特定的非标准扩展允许查询运行时不会抛出错误,而其他 RDBMS 会抛出错误。我们可以通过在`sql_mode 中包含 ONLY_FULL_GROUP_BY
来使 MySQL 行为更符合标准.但这只会导致问题中的 SQL 抛出错误。)
建议的解决方案(只是猜测)是在执行 GROUP BY
之前为每个员工派生 ac
和 ad
,然后聚合.
(我仍然怀疑与 centre
的连接,未包含在子查询中。employee
是 employees 中的主键还是唯一键
?centre
在功能上依赖于employee
吗?这么多问题,太多假设。
我的猜测是,我们在查询返回的结果之后是这样的:
SELECT c.name
, SUM(v.ad) AS `ad`
, SUM(v.ac) AS `ac`
FROM ( -- derive `ad` and `ac` in an inline view before we collapse rows
SELECT ee.employee
, ee.centre
, ( -- derived for each employee
SELECT SUM(d1.duration)
FROM time t1
JOIN dates d1
ON d1.time_id = t1.id
AND d1.date >= NOW() + INTERVAL -12 MONTH
WHERE d1.employee = t.employee
) AS `ad`
, ( -- derived for each employee
SELECT SUM(d2.cost)
FROM time t2
JOIN dates d2
ON d2.time_id = t2.id
AND d2.date >= NOW() + INTERVAL -12 MONTH
WHERE d2.employee = t.employee
) AS `ac`
FROM time t
JOIN employees ee
ON ee.employee = t.employee
WHERE ee.centre in (4792,4804,4834)
GROUP
BY ee.employee
, ee.centre
) v
LEFT
JOIN centres c
ON c.id = v.centre
GROUP
BY v.centre
, c.name
关于使用子查询时的 MySQL 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710721/