Firma prodaje neku robu. Kupci su u tabeli Customers. Svake kalendarske gosdine tabele se prazne i pocinej se od nule. Znaci, godina je uvek jedna ista za sve transakcije. Prodaja se belezi u tabeli Orders. Pitanje glasi:
"Napraviti izvestaj o prodaji za mesec Oktobar. Prikazati ImeKupca, BrojNarudzbi". Moraju biti prikazani svi kupci, cak i oni koji nisu imali ni jednu narudzbu u Oktobru.
Ova mozgalica je relativno laka, leto je pa ne zelimo bas mnogo da se mucimo. Ipak, ima vise nacina da se resi, pa niej lose da ih vidimo.
create table Customers
( CustomerID int identity(1,1)
, CustomerName varchar(50)
)
go
create table Orders
( OrderID int identity(1,1)
, CustomerID int
, OrderPlaceDate datetime
, OrderShipDate datetime
)
go
insert Customers select 'Goca'
insert Customers select 'Ceca'
insert Customers select 'Miki'
insert Customers select 'Pera'
insert Orders select 1, '9-1-05', '9-4-05'
insert Orders select 1, '10-1-05', '10-7-05'
insert Orders select 1, '11-1-05', '11-24-05'
insert Orders select 2, '9-11-05', '9-15-05'
insert Orders select 2, '9-3-05', '9-24-05'
insert Orders select 2, '9-30-05', '10-9-05'
insert Orders select 3, '10-1-05', '10-7-05'
Racunati sa datumom narudzbe, kolona Orders.OrderPlaceDate
Prvi pokusaj bi mogao da bude nesto ovako:
SELECT
C.CustomerName
, COUNT(O.OrderID) AS CountOforders
FROM Customers AS C
JOIN Orders AS O ON O.CustomerID = C.CustomerID
WHERE datepart(m, O.OrderPlaceDate) = 10
GROUP BY
C.CustomerName
, C.CustomerID
-- Rezultat
CustomerName CountOforders
-------------------------------------------------- -------------
Goca 1
Miki 1
(2 row(s) affected)
Rezultat je ocigledno pogresan. Prikazuje samo kupce koji su imali narudzbu u Oktobru.
Nista zato, ja sam strucnjak za T-SQL pa sam primenio LEFT JOIN:
SELECT
C.CustomerName
, C.CustomerID
, COUNT(O.OrderID) AS CountOforders
FROM Customers AS C
LEFT JOIN Orders AS O ON O.CustomerID = C.CustomerID
WHERE datepart(m, O.OrderPlaceDate) = 10
GROUP BY
C.CustomerName
, C.CustomerID
CustomerName CustomerID CountOforders
-------------------------------------------------- ----------- -------------
Goca 1 1
Miki 3 1
(2 row(s) affected)
Jak strucnjak, opet isti rezultat.
Sta dalje? Vidi li neko gresku u poslednjoj naredbi (sa LEFT JOIN) ili postoji i neki drugi nacin da se ovo resi?
Ispravan rezultat glasi:
CustomerName CustomerID CountOforders
-------------------------------------------------- ----------- -------------
Goca 1 1
Ceca 2 0
Miki 3 1
Pera 4 0
Kako doci do ispravnog rezultata?