Zadanie 21.

Dla klientów o ID ALFKI, ISLAT, SAVEA stwórz zestawienie, pokazujące ich uporządkowane i ponumerowane według wartości zamówienia.

Baza: Northwind, Tabele: dbo.Orders, dbo.Order Details, Kolumny: CustomerID, OrderID, UnitPrice, Quantity, Wynik: 151 rows

26

Rozwiązanie

SELECT O.CustomerID, O.OrderID, (OD.UnitPrice * OD.Quantity) as OrdVal, ROW_NUMBER() OVER(PARTITION BY O.CustomerID ORDER BY (OD.UnitPrice * OD.Quantity) DESC ) as num

FROM dbo.Orders as O JOIN dbo.[Order Details] as OD on O.OrderID = OD.OrderID WHERE O.CustomerID IN('ALFKI', 'ISLAT', 'SAVEA')

ORDER BY O.CustomerID, OrdVal DESC;

[collapse]
  • Łukasz

    Jeśli mają być uporządkowane i ponumerowane według wartości zamówienia, to chyba musimy tutaj grupować po OrderID ? Bo tak to mamy uporządkowane i ponumerowane według wartości każdego zamówionego produktu.

    • Pit

      @Łukasz

      OrderID w tej chwili ma dla nas drugorzędne znaczenie. Ponumerowanie odbywa się w kolumnie ‚num’ zaś porządkowanie w kolumnie ‚OrdVal’ (sortowanie malejąco). Pamiętaj, że mamy działać względem WARTOŚCI zamówienia (kolumna tymcz. ‚OrdVal’) a nie względem kolejności wpływu tego zamówienia do systemu.

      • Łukasz

        Chodzi mi o to, że w wyniku powtarzają się numery zamówień (kolumna OrderID).

        • Pit

          OK lecz nie zmienia to samego celu polecenia. OrderID jest dodana informacyjnie (jak dla mnie niepotrzebnie).

  • Darek

    Według mnie zaproponowane rozwiązanie jest błędne, ponieważ w wyniku nie mamy wartości całego zamówienia a wartość zamówienia danego produktu (dlatego pojawiają się wielokrotnie wiersze z tym samym OrderID). Dodatkowo należy wziąć pod uwagę zniżkę (atrybut Discount). Dlatego w klauzuli select i over (zamiast OD.UnitPrice * OD.Quantity) powinna pojawić się taka konstrukcja:
    SUM(UnitPrice*Quantity*(1-Discount))
    Wtedy mamy w wyniku wartości całych zamówień, które przecież składają się z różnych produktów. Wynik ma 47 wierszy.