Poziom zaawansowany

Zadanie 4

  1. Skopiuj tabelę dbo.Orders za pomocą SELECT INTO (tworząc tabelę dbo.Ord2).
  2. Tabeli dbo.Ord2 przypisz klucz główny na kolumnie OrderID
  3. Dodaj kolumnę ShipDelay, w której określimy, czy towar został dostarczony na czas.
  4. Wypełnij kolumnę ShipDelay danymi (RequiredDate – ShippedDate)
  5. Zmodyfikuj tabelę wstawiając 0 (zero) tam, gdzie nie było opóźnień w dostawie.
  6. Sprawdź, czy są klienci którzy dostali towar z opóźnieniem, oraz czy złożyli jeszcze jakieś zamówienia (później).

Baza: Northwind, Tabela: dbo.Orders / Ord2, Kolumny: CustomerID, OrderID, RequiredDate, ShippedDate, ShipDelay, Wynik: klienci, którzy złożyli kolejne zamówienia po otrzymaniu dostawy z opóźnieniem: 33, Klienci, którzy po opóźnionej dostawie nie złożyli już zamówień: 4, Klienci, którzy po pierwszym opóźnieniu złożyli kolejne zamówienie, ale po drugim już nie: 1

[spoiler title=’Rozwiązanie’ style=’default’ collapse_link=’true’]

1.

USE Northwind;

SELECT *

INTO dbo.Ord2

FROM dbo.Orders;

2.

ALTER TABLE dbo.Ord2

ADD CONSTRAINT OrderID_pk PRIMARY KEY (OrderID);

3.

ALTER TABLE dbo.Ord2

ADD ShipDelay INT;

4.

WITH CTE AS (

SELECT OrderID, CustomerID, RequiredDate, ShippedDate, ShipDelay, DATEDIFF(day, RequiredDate, ShippedDate) as DaysDelay

FROM dbo.Ord2

)

UPDATE CTE

SET ShipDelay = DaysDelay;

5.

UPDATE dbo.Ord2

SET ShipDelay = 0

WHERE ShipDelay <= 0;

Albo z użyciem wyrażeń tablicowych:

WITH CTE2 AS (

SELECT ShipDelay,

CASE

WHEN ShipDelay <= 0 THEN 0

ELSE ShipDelay

END AS SD

FROM dbo.Ord2

)

UPDATE CTE2

SET ShipDelay = SD;

 

  1. Klienci, którzy złożyli kolejne zamówienia po otrzymaniu dostawy z opóźnieniem:

SELECT CustomerID, OrderID

FROM dbo.Ord2

WHERE ShipDelay > 0

AND EXISTS (

SELECT *

FROM dbo.Ord2 as O

WHERE Ord2.CustomerID = O.CustomerID

AND O.OrderID > Ord2.OrderID

);

 

 

Klienci, którzy po opóźnionej dostawie nie złożyli już zamówień:

SELECT CustomerID, OrderID

FROM dbo.Ord2

WHERE ShipDelay > 0

AND NOT EXISTS (

SELECT *

FROM dbo.Ord2 as O

WHERE Ord2.CustomerID = O.CustomerID

AND O.OrderID > Ord2.OrderID

);

 

Klienci, którzy po pierwszym opóźnieniu złożyli kolejne zamówienie, ale po drugim już nie:

SELECT CustomerID

FROM dbo.Ord2

WHERE ShipDelay > 0

AND EXISTS (

SELECT *

FROM dbo.Ord2 as O

WHERE Ord2.CustomerID = O.CustomerID

AND O.OrderID > Ord2.OrderID

)

INTERSECT

SELECT CustomerID

FROM dbo.Ord2

WHERE ShipDelay > 0

AND NOT EXISTS (

SELECT *

FROM dbo.Ord2 as O

WHERE Ord2.CustomerID = O.CustomerID

AND O.OrderID > Ord2.OrderID

);

 

[/spoiler]

Alexandretta

Kobieta gracz. Po godzinach pracy, z zapałem i piekielnymi ognikami w oczach biega po lochach i tłucze bogu ducha winne zombie czy inne szkielety. Miłośniczka wszelkiej maści cRPG. Notoryczne problemy z wyborem klasy i rasy, bo wszystko fajne... W chwilach zwątpienia zatraca się przy dźwiękach mieczy, roztrzaskiwanych tarcz i okrzyków bojowych, słuchając wiking metalu z zimnej, niegościnnej, odległej Skandynawii. Czasem zdarzy jej się pograć w jakąś strategię bądź nawet w FPP, ale tylko na easy, żeby nie psuć sobie niepotrzebnie nerwów.

Related Articles

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Back to top button