- Skopiuj tabelę dbo.Orders za pomocą SELECT INTO (tworząc tabelę dbo.Ord2).
- Tabeli dbo.Ord2 przypisz klucz główny na kolumnie OrderID
- Dodaj kolumnę ShipDelay, w której określimy, czy towar został dostarczony na czas.
- Wypełnij kolumnę ShipDelay danymi (RequiredDate – ShippedDate)
- Zmodyfikuj tabelę wstawiając 0 (zero) tam, gdzie nie było opóźnień w dostawie.
- 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;
- 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]