【问题标题】:GROUP BY from inner SELECT suquery is ignored in column sum来自内部 SELECT suquery 的 GROUP BY 在列总和中被忽略
【发布时间】:2017-02-02 19:51:13
【问题描述】:

我有以下查询

SELECT YEAR(T.date), MONTH(T.date), T.production, T.lineID, SUM(rework + scrap)
FROM
   (SELECT MAX(positionID), date, production, lineID
    FROM productionPerPosition
    WHERE lineID = 2
    AND date BETWEEN '2017-01-01' AND '2017-01-31'
    GROUP BY date) AS T
INNER JOIN linePosition lp ON lp.lineID = T.lineID
INNER JOIN fttErrorType fet ON fet.positionID = lp.positionID
INNER JOIN fttData fd ON fd.errorID = fet.errorID
                        AND fd.date = T.date
GROUP BY YEAR(T.date), MONTH(T.date)

给出这个结果

现在,我想按年份和月份对这些结果进行分组,以获得生产总和和最后一列的总和。我试过这个查询

SELECT YEAR(T.date), MONTH(T.date), SUM(T.production), T.lineID, SUM(rework + scrap)
FROM
   (SELECT MAX(positionID), date, production, lineID
    FROM productionPerPosition
    WHERE lineID = 2
    AND date BETWEEN '2017-01-01' AND '2017-01-31'
    GROUP BY date) AS T
INNER JOIN linePosition lp ON lp.lineID = T.lineID
INNER JOIN fttErrorType fet ON fet.positionID = lp.positionID
INNER JOIN fttData fd ON fd.errorID = fet.errorID
                        AND fd.date = T.date
GROUP BY YEAR(T.date), MONTH(T.date)

这给了我

这里的生产总和是错误的!似乎忽略了第一个查询中第 7 行的 GROUP BY。

知道如何获得所需的结果吗?

编辑:在内部 SELECT 中,我对几个不同的位置 (positionID) 有单独的生产,但我只使用来自具有最高 positionID 的位置的生产

【问题讨论】:

标签: mysql


【解决方案1】:

组缺少分组列,导致某些意外结果

 SELECT YEAR(T.date), MONTH(T.date), SUM(T.production), T.lineID, SUM(rework + scrap)
    FROM
       (SELECT MAX(positionID), date, production, lineID
        FROM productionPerPosition
        WHERE lineID = 2
        AND date BETWEEN '2017-01-01' AND '2017-01-31'
        GROUP BY date, production, lineID) AS T
    INNER JOIN linePosition lp ON lp.lineID = T.lineID
    INNER JOIN fttErrorType fet ON fet.positionID = lp.positionID
    INNER JOIN fttData fd ON fd.errorID = fet.errorID
                            AND fd.date = T.date
    GROUP BY YEAR(T.date), MONTH(T.date), T.lineID

【讨论】:

  • 仍然得到相同的结果
【解决方案2】:

已在 e4c5 评论中解释,您必须将所有未聚合的字段添加到您的 GROUP BY。我在内部 SELECT 和主 SELECT 中做到了:

SELECT YEAR(T.date), MONTH(T.date), SUM(T.production), T.lineID, SUM(rework + scrap)
FROM
   (SELECT MAX(positionID), date, production, lineID
    FROM productionPerPosition
    WHERE lineID = 2
    AND date BETWEEN '2017-01-01' AND '2017-01-31'
    GROUP BY date, production, lineID) AS T
INNER JOIN linePosition lp ON lp.lineID = T.lineID
INNER JOIN fttErrorType fet ON fet.positionID = lp.positionID
INNER JOIN fttData fd ON fd.errorID = fet.errorID
                        AND fd.date = T.date
GROUP BY YEAR(T.date), MONTH(T.date), T.lineID

【讨论】:

  • 修改后的查询仍然得到相同的结果
  • 子查询中的返工和报废字段在哪里?我认为您必须公开它们并将它们分组。
  • 它们只存在于 fttData 表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多