PIVOT sa promjenljivim brojem kolona – dinamički pivot

Objavljeno: 06-05-2014 | Autor: Žana (Jovana) Baćović | Kategorija: T-SQL

Ознаке:

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:

Dinamicki pivot

Dodavanjem novih epizoda, dodavaće se godine proizvodnje, ali će upit raditi nezavisno od toga, prikazivaće onoliko kolona koliko bude godina proizvodnje.

Komentari (1)

Ovo je ok ali me zanima da li i kako ovaj @SQLUpit mogu da insertujem u neku tabelu