Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
42
Rozdział2:Zapytaniadopojedynczejtabeli
4
2022
6
2022
(15rowsaffected)
651.83
227.22
3
1
WyrażenieSUM(freight)zwracasumęwszystkichwartościfrachtuzatowarywkażdej
grupie,afunkcjaCOUNT(*)zwracaliczbęwierszywkażdejgrupiecowtymprzy-
padkuoznaczaliczbęzamówień.Jeślispróbujemyodwołaćsiędoatrybutu,którynie
znajdujesięnaliścieGROUPBY(takiegojakfreight)iodwołanietoniepełnirolidanych
wejściowychdlafunkcjiagregującejwklauzuliprzetwarzanejpoklauzuliGROUPBY,
otrzymamybłądwtakimprzypadkuniemagwarancji,żewyrażeniezwrócipoje-
dyncząwartośćdlagrupy
.Naprzykładnastępującezapytanieniezadziała:
SELECTempid,YEAR(orderdate)ASorderyear,freight
FROMSales.Orders
WHEREcustid=71
GROUPBYempid,YEAR(orderdate);
SQLServerzwrócinastępującybłąd:
Msg8120,Level16,State1,Line1
Column'Sales.Orders.freight'isinvalidintheselectlistbecauseitisnot
containedineitheranaggregatefunctionortheGROUPBYclause
(Kolumna'Sales.Orders.freight'jestnieprawidłowanaliścieselect,ponieważ
niejestzawartawfunkcjiagregującejlubklauzuliGROUPBY.)
Zwróćmyuwagęnato,żefunkcjeagregująceignorująznacznikiNULL.Funkcja
COUNT(*)niejeststosowanadożadnegowyrażeniawejściowego;poprostuzliczawier-
sze,niezależnieodtego,cotewierszezawierają.Przeanalizujmynaprzykładgrupę
pięciuwierszyowartościach30,10,NULL,10,10wkolumnienazwanejqty.Wyrażenie
COUNT(*)zwróciwartość5,ponieważwgrupieistniejepięćwierszy
,natomiastwyra-
żenieCOUNT(qty)zwróci4,ponieważtamczteryznane(nie-NULL)wartości.Jeśli
chcemyobsługiwaćtylkoróżne(unikatowe)wystąpieniaznanychwartości,specyfi-
kujemysłowokluczoweDISTINCTdlaargumentówfunkcjiagregującej(wnawiasach).
NaprzykładwyrażenieCOUNT(DISTINCTqty)zwróci2,ponieważistniejądwieróżne
znanewartości.SłowokluczoweDISTINCTmożebyćużywanetakżezinnymifunk-
cjamiagregującymi.PrzykładowowyrażenieSUM(qty)zwróci60,natomiastwyrażenie
SUM(DISTINCTqty)zwróciwartość40.WyrażenieAVG(qty)zwróci15,natomiastwyra-
żenieAVG(DISTINCTqty)zwróci20.JakoprzykładdziałaniaopcjiDISTINCTzfunkcją
agregującą,poniższykodzwracaliczbęróżnychklientówobsługiwanychprzezkaż-
degopracownikawkażdymroku.
SELECT
empid,
YEAR(orderdate)ASorderyear,
COUNT(DISTINCTcustid)ASnumcusts
FROMSales.Orders
GROUPBYempid,YEAR(orderdate);