Группировать по ошибке в MySQL с sql_mode = only_full_group_by - PullRequest
0 голосов
/ 07 апреля 2019

Tring следующий запрос, но я получаю; Код ошибки: 1055. Выражение № 3 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'PDC.PLG.LogDateTime', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

Я знаю, что это из-за только полной группы по режиму; Как я могу рефакторинг такого рода запроса?

SELECT     
SUM(PLG.Qty) AS TotQty,
SUM(PLG.ScrapQty) AS ScrpQty,   
(
SELECT SUM(PLL.Qty) 
FROM ProductionLog AS PLL
INNER JOIN ProductionPlan PPP ON PPP.PlanId = PLL.PlanId
WHERE 
DATE(LogDateTime) = DATE(PLG.LogDateTime) AND 
LogType = 8 AND 
PPP.StationId = PP.StationId

) AS RwrkQty,

DATE(PLG.LogDateTime) AS LogDate,
S.StationName
FROM ProductionLog AS PLG
INNER JOIN ProductionPlan  AS PP ON PLG.PlanId = PP.PlanId
INNER JOIN Station AS S ON S.StationId = PP.StationId
WHERE PLG.Logtype IN (4)

GROUP BY S.StationId,DATE(PLG.LogDateTime)

1 Ответ

1 голос
/ 07 апреля 2019

Во-первых, правильный запрос с использованием GROUP By означает, что независимо от результирующих полей, которые вы пытаетесь вернуть, ваша GROUP by должна включать ВСЕ поля, к которым не применена агрегация (min, max, sum, avg и т. Д.).чего не хватает, так это того, что в списке есть дополнительный столбец, который не агрегируется, но также не является частью группы по.Так что либо добавьте это неагрегированное поле в группу (даже если последнее поле в группе), либо примените к нему некоторую агрегацию.

Теперь, очистка для читабельности вашего исходного запроса для читабельности того, чтоэто где и / или подзапрос следующего.

SELECT     
      SUM(PLG.Qty) AS TotQty,
      SUM(PLG.ScrapQty) AS ScrpQty,   
      ( SELECT SUM(PLL.Qty)
           FROM ProductionLog AS PLL
              INNER JOIN ProductionPlan PPP 
                 ON PPP.PlanId = PLL.PlanId
           WHERE 
                  DATE(LogDateTime) = DATE(PLG.LogDateTime) 
              AND LogType = 8 
              AND PPP.StationId = PP.StationId ) AS RwrkQty,
      DATE(PLG.LogDateTime) AS LogDate,
      S.StationName
   FROM 
      ProductionLog AS PLG
         INNER JOIN ProductionPlan  AS PP 
            ON PLG.PlanId = PP.PlanId
         INNER JOIN Station AS S 
            ON S.StationId = PP.StationId
   WHERE 
      PLG.Logtype IN (4)
   GROUP BY 
      S.StationId,
      DATE(PLG.LogDateTime)

В вашем сценарии ваш 3-й столбец, основанный на запросе, уже агрегирован ВНУТРИ, но для запроса OUTER это НЕагрегируются.Чтобы упростить это, просто оберните его в MIN (), например

      MIN( ( SELECT SUM(PLL.Qty)
           FROM ProductionLog AS PLL
              INNER JOIN ProductionPlan PPP 
                 ON PPP.PlanId = PLL.PlanId
           WHERE 
                  DATE(LogDateTime) = DATE(PLG.LogDateTime) 
              AND LogType = 8 
              AND PPP.StationId = PP.StationId ) ) AS RwrkQty,

Поскольку внутренний запрос всегда возвращает только 1 строку, суммирование 1 строки в любом случае вернет одно и то же значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...