PIVOT sa promjenljivim brojem kolona – dinamički pivot
Objavljeno: 06-05-2014 | Autor: Žana (Jovana) Baćović | Kategorija: T-SQL
Ознаке: Agregatne funkije
1
Relacioni operator PIVOT u T-SQL-u se koristi za rotiranje tabele, tako što jedinstvene vrijednosti kolone transformiše u toliki broj kolona, pri čemu obavlja potrebne agregacije nad vrijednostima preostalih kolona. Jednostavnije rečeno, prevodi vertikalno orjentisanu tabelu u horizontalno orjentisanu tj. sa nivoa redova prelazi se na nivo kolona.
Često je skup vrijednosti kolone od koje kreiramo nove kolone konačan (ili želimo da prikažemo samo određene vrijednosti) i tada se, za taj skup, koristi PIVOT za predefinisani skup kolona.
Nekada je skup vrijednosti kolone koju želimo da pivotiramo po svim vrijednostima promljenljiv i tada se koristi dinamički pivot.
Primjer: Nad SQL Kefalo bazom kreirati upit koji kao rezultat daje broj epizoda za svaki crtać, po svim godinama u kojima su epizode proizvedene. Godine proizvodnje prikazati kao kolone.
Pošto je spisak godina proizvodnje promjenljiv, prvi korak je da se kreira taj spisak, koji će predstavljati spisak kolona u PIVOT-u. Ova konkatenacija stringa može da se uradi na više načina, kao što je opisano u prethodnim člancima:
Konkatenacija string vrednosti iz razlicitih redova (1. deo)
Konkatenacija string vrednosti iz razlicitih redova (2. deo)
Koristićemo primjer sa FOR XML PATH i STUFF funkcijom:
DECLARE @SpisakGodina AS NVARCHAR(MAX) SET @SpisakGodina = STUFF((SELECT distinct '],[' + CAST(GodinaPremijernogIzvodjenja AS NVARCHAR(5)) FROM dbo.CrtaneEpizode FOR XML PATH('') ),1,2,'') + ']';
Napomena: U verziji SQL Servera 2012 je moguće umjesto dodavanja srednjih zagrada ”[]” koristiti funkciju QUOTENAME.
Nakon kreiranja spiska godina, kreira se dinamički upit:
DECLARE @SQLUpit AS NVARCHAR(MAX) SET @SQLUpit = 'SELECT Naziv, ' + @SpisakGodina + ' FROM ( SELECT CF.Naziv,GodinaPremijernogIzvodjenja FROM dbo.CrtaneEpizode CE INNER JOIN dbo.CrtaniFilmovi CF ON CF.CrtacID = CE.CrtacID ) AS Izvor PIVOT (COUNT(GodinaPremijernogIzvodjenja) FOR GodinaPremijernogIzvodjenja IN (' + @SpisakGodina + ') ) P'; EXEC sp_executesql @SQLUpit;
Prikazaće se željeni rezultat:
Dodavanjem novih epizoda, dodavaće se godine proizvodnje, ali će upit raditi nezavisno od toga, prikazivaće onoliko kolona koliko bude godina proizvodnje.
Ovo je ok ali me zanima da li i kako ovaj @SQLUpit mogu da insertujem u neku tabelu