Avatar billede hyperactive Nybegynder
03. juli 2004 - 13:11 Der 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
Avatar billede dadane Novice
03. juli 2004 - 14:10 #1
Det er korrekt. Du får n gange så summen hvis du har n poster i orderItems.
Og det er vel også løsningen.

Så prøv :
SUM(Transactions.quantity)/COUND(orderItems.ID) AS QtyOnHand
Avatar billede dadane Novice
03. juli 2004 - 14:11 #2
COUNT ikke COUND
Avatar billede veronica Nybegynder
04. juli 2004 - 08:43 #3
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
Avatar billede veronica Nybegynder
04. juli 2004 - 08:44 #4
hov det var vidst et svar (?)
Avatar billede hyperactive Nybegynder
04. juli 2004 - 12:48 #5
veronica...

Jeg har udskiftet linien:
LEFT JOIN OrderItems ON P.SKU = OrderItems.SKU AND OrderItems.StatusCode = 1

Med

LEFT JOIN ( SELECT distinct OrderItemId, OrderId, SKU, Special, Quantity, AdjustedPrice, ItemDescription, CustomValues, StatusCode FROM OrderItems) as OrderItems2 ON P.SKU = OrderItems2.SKU AND OrderItems2.StatusCode = 1

Men det giver fejlen:

The column prefix 'OrderItems' does not match with a table name or alias name used in the query.
Avatar billede hyperactive Nybegynder
04. juli 2004 - 13:14 #6
dadane, en ok løsning, men står jo med det samme problem med SUM(Transactions.quantity) og SUM(PurchaseOrderItems.Quantity)
Avatar billede veronica Nybegynder
09. august 2004 - 18:55 #7
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 :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester