GROUP BY – grupisanje rezultata upita

Odredba GROUP BY

Odredba GROUP BY se koisti za izračunavanje sumarne statistike. Definicija Odredbe GROUP BY je:

GROUP BY  expression1 [,group by – expression2 [,…] ]

Odredba GROUP BY koristi se da se zadaju polja po kojima SQL Server grupiše rezultat upita. Kada u odredbi GROUP BY zadate više polja, onda se grupisanje po poljima vrši s leva na desno. SQL Server automatski prikazuje polja u redosledu u kojem su zadata u odredbi GROUP BY.

Primer 1:

SELECT SalesLT.Product.ProductID
,  SalesLT.Product.Name
,  SalesLT.Product.ProductNumber
,  sum(SalesLT.SalesOrderDetail.UnitPrice) as Total
FROM SalesLT.Product
INNER JOIN SalesLT.SalesOrderDetail
on SalesLT.Product.ProductID = SalesLT.SalesOrderDetail.ProductID
group by SalesLT.Product.ProductID
,  SalesLT.Product.Name
,  SalesLT.Product.ProductNumber

Nakon izvršavanja SELECT naredbe sa odredbom GROUP BY prikazuju se podaci o proizvodu i ukupan iznos za Product.ProductID. Rezultati koji se prikazuju se uređuju prema ProductID. Odredba GROUP BY pokazuje da SQL Server ne prikazuje detalje za odabrane slogove. Umesto toga prikazuje polja koja su zadata u odredbi GROUP BY. Za jedno od polja koje je zadato u iskazu SELECT mora se upotrebiti agregatna funkcija. SQL Server prikazuje rezultat agregatne funkcije i polja koja su zadata u odredbi GROUP BY.

Korišćenje odredbe HAVIHG

Odredba HAVING je slična odredbi WHERE, ali se ove dve odredbe razlikuju u jednom važnom pogledu: SQL Server odredbu HAVING primenjuje pošto sumira podatke. Drugim rečima odredba WHERE se koristi za određivanje redova koji će biti grupisani. Odredba HAVING se koristi za određivanje grupa koje će se prikazati u rezultatu.

Definicija odredbe HAVING

HAVING expression1 [{AND| OR} expression1 […]]

Primer 2:

SELECT SalesLT.Product.ProductID
,  SalesLT.Product.Name
,  SalesLT.Product.ProductNumber
,  sum(SalesLT.SalesOrderDetail.UnitPrice) as Total
FROM SalesLT.Product
INNER JOIN SalesLT.SalesOrderDetail
on SalesLT.Product.ProductID = SalesLT.SalesOrderDetail.ProductID
group by SalesLT.Product.ProductID
,  SalesLT.Product.Name
,  SalesLT.Product.ProductNumber
HAVING (((Sum(SalesLT.SalesOrderDetail.UnitPrice)) > 1000))

Upiti pomoću kojih se prikazuje unija podataka

Upiti pomoću kojih se prikazuje unija podataka vam omogućavaju da kombinujete, a ne da spajate podatke iz više tabela.

Primer 3:

SELECT SalesLT.Product.ProductID
, SalesLT.Product.Name
, SalesLT.Product.ListPrice
FROM SalesLT.Product
UNION ALL
SELECT Product2.ProductID
, Product2.Name
, Product2.ListPrice
FROM Product2

Napomena: neophodno je kreirati tabelu Product2 sa istom strukturom kao tabela Products. Primer obezbeđuje prikaz svih redova iz tabele Products i svih redova iz tabele Products2. Ukoliko želite da sortirate rezultate upita, dodajte odredbu ORDER BY iza drugog iskaza.

SELECT SalesLT.Product.ProductID
, SalesLT.Product.Name
, SalesLT.Product.ListPrice
FROM SalesLT.Product
UNION ALL
SELECT Product2.ProductID
, Product2.Name
, Product2.ListPrice
FROM Product2
order by SalesLT.Product.ListPrice DESC

U prethodnom primeru SQL Server kombinuje rezultate oba iskaza SELECT i uređuje ih u opadajućem redosledu po koloni ListPrice.

SQL Podupiti

Podupit je upit koji SQL Server izvršava pre nego što izvrši glavni upit.

Primer:

SELECT SalesLT.Product.ProductID,SalesLT.Product.Name
, SalesLT.Product.ProductNumber
FROM SalesLT.Product
where SalesLT.Product.ProductCategoryID in
(select SalesLT.ProductCategory.ProductCategoryID
from SalesLT.ProductCategory)

U primeru izdvajamo podatke iz tabele SalesLT.ProductCategory pre nego što izvrši upit pomoću kojeg se izdvajaju podaci iz tabele SalesLT.Product. Ovo nije veoma efikasan način za pronalaženje svih proizvoda. Bolje rešenje je upit u kojem se koristi spoljašnje spajanje.

Tutorijali - Materijali za učenje