Impossible de faire fonctionner la fonction SUM avec ma requête
J'essaie de sommer certaines valeurs de stock d'entrepôt, regroupées par zones, mais je n'arrive pas à le faire fonctionner.
La requête suivante renvoie tous les articles en stock. Le même matériau est placé sur plus d'emplacements, dans plus de zones. Ainsi le matériel AAA peut être localisé sur deux emplacements dans la zone 111, et trois emplacements dans la zone 222
SELECT Zones.Label,
Materials.Material,
Shelves.Label as ShelfLabel,
Items.StockQty
FROM Zones INNER JOIN
(dbo.LangTexts(null) AS Texts INNER JOIN (WarehouseStatus INNER JOIN
(Shelves INNER JOIN (Positions INNER JOIN
(Materials INNER JOIN Items
ON Materials.Material = Items.Material)
ON Positions.ID = Items.Owner)
ON Shelves.ID = Positions.Owner)
ON WarehouseStatus.Status = Items.Status)
ON Texts.TextID = WarehouseStatus.Text)
ON Zones.ID = Shelves.Owner
WHERE Zones.Label IS NOT NULL
ORDER BY Materials.Material, Zones.Label
Sortir:
Comme j'ai essayé de baliser dans la capture d'écran, j'ai besoin du StockQty total regroupé par zone (colonne d'étiquette)
J'essaie d'y parvenir en modifiant la requête comme ceci.
SELECT Zones.Label,
Materials.Material,
Shelves.Label as ShelfLabel,
SUM(Items.StockQty)
FROM Zones INNER JOIN
(dbo.LangTexts(null) AS Texts INNER JOIN (WarehouseStatus INNER JOIN
(Shelves INNER JOIN (Positions INNER JOIN
(Materials INNER JOIN Items
ON Materials.Material = Items.Material)
ON Positions.ID = Items.Owner)
ON Shelves.ID = Positions.Owner)
ON WarehouseStatus.Status = Items.Status)
ON Texts.TextID = WarehouseStatus.Text)
ON Zones.ID = Shelves.Owner
WHERE Zones.Label IS NOT NULL
GROUP BY Zones.Label
ORDER BY Materials.Material, Zones.Label
Mais il continue de retourner l'erreur suivante.
Msg 8120, niveau 16, état 1, ligne 6 La colonne « Materials.Material » n'est pas valide dans la liste de sélection car elle n'est contenue ni dans une fonction d'agrégat ni dans la clause GROUP BY.
J'ai déjà eu affaire à une telle erreur, mais je ne comprends pas exactement ce que je fais mal. Parfois, je réussis en changeant la requête d'avant en arrière, mais cette fois, je suis vraiment coincé.
J'espère que quelqu'un est possible de me guider.
Merci d'avance.
Comme la colonne Shelves.Label n'apporte en fait aucune valeur à ce sujet, je me suis retrouvé avec la requête suivante basée sur la réponse de @Md.SumanKabir.
SELECT Zones.Label,
Materials.Material,
SUM(Items.StockQty)
FROM Zones INNER JOIN
(dbo.LangTexts(null) AS Texts INNER JOIN (WarehouseStatus INNER JOIN
(Shelves INNER JOIN (Positions INNER JOIN
(Materials INNER JOIN Items
ON Materials.Material = Items.Material)
ON Positions.ID = Items.Owner)
ON Shelves.ID = Positions.Owner)
ON WarehouseStatus.Status = Items.Status)
ON Texts.TextID = WarehouseStatus.Text)
ON Zones.ID = Shelves.Owner
WHERE Zones.Label IS NOT NULL
GROUP BY Zones.Label, Materials.Material
ORDER BY Materials.Material, Zones.Label
La requête correcte serait :
SELECT Zones.Label,
Materials.Material,
Shelves.Label as ShelfLabel,
SUM(Items.StockQty)
FROM Zones INNER JOIN
(dbo.LangTexts(null) AS Texts INNER JOIN (WarehouseStatus INNER JOIN
(Shelves INNER JOIN (Positions INNER JOIN
(Materials INNER JOIN Items
ON Materials.Material = Items.Material)
ON Positions.ID = Items.Owner)
ON Shelves.ID = Positions.Owner)
ON WarehouseStatus.Status = Items.Status)
ON Texts.TextID = WarehouseStatus.Text)
ON Zones.ID = Shelves.Owner
WHERE Zones.Label IS NOT NULL
GROUP BY Zones.Label, Materials.Material, Shelves.Label
ORDER BY Materials.Material, Zones.Label
Vous devez utiliser les colonnes de GROUP BY qui ne sont utilisées dans aucune fonction d'agrégat comme SUM
Vous pouvez obtenir plus d'informations sur l'utilisation de GROUP BY ici