Reputation: 1626
Tring the following query but i get; Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'PDC.PLG.LogDateTime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
I know that this is because of only full group by mode; how can I refactor this sort of query?
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)
Upvotes: 0
Views: 289
Reputation: 48129
First, a proper query using a GROUP By means whatever the result fields you are trying to return, your GROUP by should include ALL fields that do not have any aggregation applied (min, max, sum, avg, etc.) So what is missing is that an extra column is in the list that is not aggregated, but also not part of the group by. So either add this non-aggregate field to the group by (even if the last field in group by), OR apply some aggregation to it.
Now, a cleanup for readability of your original query for readability of what is where and/or subquery of the next.
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)
In your scenario, your 3rd column which is based on a query has already been aggregated INSIDE it, but for respect to the OUTER query, it is NOT aggregated. To simplify this, just wrap IT in a MIN() such as
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,
Since the inner query is only ever returning 1 row, summing 1 row will return the same value anyhow.
Upvotes: 1