使用子查询时的 MySQL 分组

标签 mysql group-by subquery

我正在尝试创建一个摘要输出,以根据子查询中的值显示总计,然后按标签对输出进行分组

查询如下:

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 的每个值,.employee 都会折叠成一行,并且 t.employee 的值来自放。 (MySQL 特定的非标准扩展允许查询运行时不会抛出错误,而其他 RDBMS 会抛出错误。我们可以通过在`sql_mode 中包含 ONLY_FULL_GROUP_BY 来使 MySQL 行为更符合标准.但这只会导致问题中的 SQL 抛出错误。)

建议的解决方案(只是猜测)是在执行 GROUP BY 之前为每个员工派生 acad,然后聚合.

(我仍然怀疑与 centre 的连接,未包含在子查询中。employeeemployees 中的主键还是唯一键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/

相关文章:

mysql 查询分组依据/排序依据计数

mysql - 在另一个查询中查询以计算另一个表中的项目数量

mysql - 优化多级 MySQL 子查询(folksonomy 和分类法)

mysql - 具有连接和分页功能的 eclipselink

mysql - 获取每个 "group"的前 5 条记录

php - 一个查询中两个表的 ORDER BY 结果

sql - oracle sql 选择语法与 GROUP BY 和 HAVING 子句

sql - 需要加快这条SQL语句的结果。有什么建议吗?

php - 在 php 附近的邮政编码页面中返回 Sql 错误

php - 从 MySQL 数据库中选择表单中的默认值