03. juli 2004 - 13:11Der er
6 kommentarer og 1 løsning
SQL problem med SUM
SELECT ProductId, P.SKU, Description, RetailPrice, ActualPrice, SUM(Transactions.quantity) AS QtyOnHand, SUM(OrderItems.Quantity) AS QtyOrdered, SUM(PurchaseOrderItems.Quantity) AS QtyAS, ReleaseDate, V.CustomValues, Farve, Størrelse FROM ProductSKUs P LEFT OUTER JOIN #CustomFieldValues V ON P.SKU = V.ProductSKU COLLATE database_default LEFT JOIN Transactions ON P.SKU = Transactions.SKU LEFT JOIN PurchaseOrderItems ON P.SKU = PurchaseOrderItems.SKU AND PurchaseOrderItems.StatusCode = 2 LEFT JOIN OrderItems ON P.SKU = OrderItems.SKU AND OrderItems.StatusCode = 1
WHERE ProductId = @ProductId
GROUP BY P.SKU, Description, P.ProductId, P.QtyOnHand, P.QtyOrdered, RetailPrice, ActualPrice, QtyAtSupplier, ReleaseDate, V.CustomValues, P.Farve, P.Størrelse
Problemet med ovennævnte er, at hvis der f.eks. er to poster i orderItems, så bliver summen af PurchaseOrderItems.Quantity af en eller anden grund ganget med 2.... (Sådan ser det i hvert fald umiddelbart ud...) Håber der er en SQL haj, der kan hjælpe
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Ja sådan er sql :-) Men hvis du ikke ønsker denne dobbelt-sum kan du anvende DISTINCT keyword'et i en sub-select.. Kan ikke lige overskue hvilke kolonner, der kommer fra hvilke tabeller - men hvis du udskifter <columns> med de kolonner, der kommer fra orderItems bør følgende virke.. Men det forudsætter selvfølgelig, at dine rækker fra orderItems så bliver unikke ! :-)
SELECT ProductId, P.SKU, Description, RetailPrice, ActualPrice, SUM(Transactions.quantity) AS QtyOnHand, SUM(OrderItems.Quantity) AS QtyOrdered, SUM(PurchaseOrderItems.Quantity) AS QtyAS, ReleaseDate, V.CustomValues, Farve, Størrelse FROM ProductSKUs P LEFT OUTER JOIN #CustomFieldValues V ON P.SKU = V.ProductSKU COLLATE database_default LEFT JOIN Transactions ON P.SKU = Transactions.SKU LEFT JOIN PurchaseOrderItems ON P.SKU = PurchaseOrderItems.SKU AND PurchaseOrderItems.StatusCode = 2 LEFT JOIN ( SELECT distinct <columns> FROM OrderItems) as OrderItems ON P.SKU = OrderItems.SKU AND OrderItems.StatusCode = 1
WHERE ProductId = @ProductId
GROUP BY P.SKU, Description, P.ProductId, P.QtyOnHand, P.QtyOrdered, RetailPrice, ActualPrice, QtyAtSupplier, ReleaseDate, V.CustomValues, P.Farve, P.Størrelse
hej igen - grunden til, at du får fejlen "The column prefix 'OrderItems' does not match with a table name or alias name used in the query." er, at du har kaldt din "inner-query" (ie. din select statement i parentes) for OrderItems2, mens du i starten af din select statement henviser til OrderItems.Quantity. Du må derfor enten kalde din innerQuery OrderItems, eller henvise til OrderItems2.Quantity. Du skal tænke på din innerQuery som et select statement i sig selv - ie. de data, der hentes fungerer ligesom hvis du angav et tabelnavn. Og så bør du i øvrigt nok i din innerQuery nøjes med at vælge de kolonner, som du faktisk bruger - ie. kun SKU, statuscode og Quantity. Altså...
SELECT ProductId, P.SKU, Description, RetailPrice, ActualPrice, SUM(Transactions.quantity) AS QtyOnHand, SUM(OrderItems.Quantity) AS QtyOrdered, SUM(PurchaseOrderItems.Quantity) AS QtyAS, ReleaseDate, V.CustomValues, Farve, Størrelse FROM ProductSKUs P LEFT OUTER JOIN #CustomFieldValues V ON P.SKU = V.ProductSKU COLLATE database_default LEFT JOIN Transactions ON P.SKU = Transactions.SKU LEFT JOIN PurchaseOrderItems ON P.SKU = PurchaseOrderItems.SKU AND PurchaseOrderItems.StatusCode = 2 LEFT JOIN ( SELECT distinct SKU, StatusCode, Quantity FROM OrderItems) as OrderItems ON P.SKU = OrderItems.SKU AND OrderItems.StatusCode = 1 WHERE ProductId = @ProductId GROUP BY P.SKU, Description, P.ProductId, P.QtyOnHand, P.QtyOrdered, RetailPrice, ActualPrice, QtyAtSupplier, ReleaseDate, V.CustomValues, P.Farve, P.Størrelse
Håber, det lykkes denne gang :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.