SlideShare a Scribd company logo
Co to te CTE?
I jak zrobić PIVOT?
(oraz słów kilka o GROUPING SETS)
90. Spotkanie PLSSUG Warszawa, 08.10.2015
O czym będzie?
• Co to CTE, a przede wszystkim jak działa rekurencja w CTE?
• Jak obracać dane, czyli PIVOT i UNPIVOT na kilka sposobów
• Grupowanie wielopoziomowe, czyli GROUPING SETS
O mnie
Bartosz Ratajczyk
programista baz danych
(i aplikacji)
czasem też administrator
trener
T-SQL, ETL, C#, PHP, JS, SAS 4GL
http://bartekr.net | b.ratajczyk@gmail.com
MCTS SQL Server 2008, MCSA SQL Server 2012, MCT
CTE
Czyli Common Table Expression
Table expressions
Nazwane zapytania, które możemy traktować tak samo jak tabele
Nieutrwalone Utrwalone
Derived table View
Common Table Expression Table Valued Function
Jak wygląda CTE?
-- pokaż sprzedaż pracowników w danym miesiącu
;WITH Dane AS (
SELECT
Pracownik = p.nazwa,
Produkt = pr.nazwa,
RokMiesiac = YEAR(s.data_sprzedazy) * 100 + MONTH(s.data_sprzedazy),
s.ilosc,
s.wartosc
FROM Sprzedaz s
INNER JOIN Pracownik p
ON p.id = s.pracownik_id
INNER JOIN Produkt pr
ON pr.id = s.produkt_id
)
SELECT
*
FROM Dane
CTE z nazwami kolumn
-- pokaż sprzedaż pracowników w danym miesiącu
;WITH Dane (Pracownik, Produkt, RokMiesiąc, Ilość, Wartość) AS (
SELECT
Pracownik = p.nazwa,
Produkt = pr.nazwa,
RokMiesiac = YEAR(s.data_sprzedazy) * 100 + MONTH(s.data_sprzedazy),
s.ilosc,
s.wartosc
FROM Sprzedaz s
INNER JOIN Pracownik p
ON p.id = s.pracownik_id
INNER JOIN Produkt pr
ON pr.id = s.produkt_id
)
SELECT
*
FROM Dane
A ta rekurencja?
;WITH Poziomy AS (
SELECT <kolumny>
FROM Pracownik p
WHERE
przelozony_id IS NULL
UNION ALL
SELECT <kolumny>
FROM Pracownik p
INNER JOIN Poziomy po
ON po.pracownik_id = p.przelozony_id
)
SELECT *
FROM Poziomy
Rekurencja
• Rekurencja w programowaniu: funkcja wywołuje samą siebie
• Rekurencja w SQL: zapytanie wywołuje samo siebie
Różnica między iteracją a rekurencją?
Iteracja: 55 = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
Rekurencja:
55 = 10 + (Suma liczb od 1 do 9)
55 = 10 + 9 + (Suma liczb od 1 do 8)
55 = 10 + (9 + (8 + (7 + (6 + (5 + (4 + (3 + (2 + (1)))))))))
DEMO
Plan zapytania rekurencyjnego CTE
Ma to jakieś ograniczenia albo wady?
• CTE vs funkcja (32 poziomy)
• MAXRECURSION X vs MAXRECURSION 0
• Widoczność tylko dla następnego zapytania
• Trudniej testować niż derived tables
• Każde odwołanie do CTE to jego wywołanie od zera (nie dotyczy
rekurencji)
Obracanie danych
Czyli PIVOT, UNPIVOT i inne konstrukcje
Jak wygląda polecenie PIVOT (i dlaczego tak?)
SELECT
Pracownik,
Produkt,
[201401], [201402], [201403], [201404], [201405], [201406],
[201407], [201408], [201409], [201410], [201411], [201412]
FROM Dane
PIVOT (
SUM(ilosc)
FOR RokMiesiac IN (
[201401], [201402], [201403], [201404], [201405], [201406],
[201407], [201408], [201409], [201410], [201411], [201412]
)
) p
No ale dlaczego tak?
• Jaich informacji potrzebujemy do obrócenia danych z wierszy na
kolumny:
• Po czym grupujemy?
• Z której kolumny bierzemy atrybuty?
• Które wartości nas interesują?
• I jak je zliczać?
A jak to przełożyć na kod – za chwilę
DEMO
To całkiem niezłe, ale ma ograniczenia
• Tylko jedna funkcja agregująca w konstrukcji PIVOT
• Muszę znać nazwy kolumn i podać je wprost
Zgadza się, ale można to obejść
DEMO
To teraz w drugą stronę – z kolumn na wiersze
SELECT
Pracownik,
Produkt,
RokMiesiac,
Wartosc
FROM SprzedazPivot
UNPIVOT (
Wartosc
FOR RokMiesiac IN (
[201401], [201402], [201403], [201404], [201405], [201406],
[201407], [201408], [201409], [201410], [201411], [201412]
)
) u
To znowu – dlaczego tak?
• Jakich informacji potrzebujemy do zmiany kolumn na wiersze:
• Które kolumny mają trafić jako wiersze?
• Jak się ma nazywać kolumna, która będzie trzymała nazwy kolumn?
• Jak ma się nazywać kolumna z wartościami z tych kolumn?
DEMO
Ten UNPIVOT tez ma wady
• Też muszę podać nazwy tych wszystkich kolumn?
Tak, ale wiesz już jak to obejść
• Nie da się obrócić więcej niż jednego zestawu kolumn
Ale na to też jest sposób
DEMO
GROUPING SETS
Czyli grupujemy wielopoziomowo
Co to GROUPING SET?
• To po prostu zestaw wyrażeń, po których grupujemy
Czyli pisząc tak:
GROUP BY Produkt, Rok, Miesiac, Dzien
Możemy napisać tak:
GROUP BY GROUPING SETS (
(Produkt, Rok, Miesiac, Dzien)
)
(ale wyjdzie dłużej)
No rewelacja, a daje to coś więcej?
• Oczywiście – możemy podać kilka zestawów na raz
GROUP BY GROUPING SETS (
(Produkt, Rok, Miesiac, Dzien),
(Produkt, Rok),
(Produkt, Rok, Miesiac),
()-- <-- TOTAL
)
DEMO
GROUPING() i GROUPING_ID()
• GROUPING() sprawdza, czy rekord pochodzi z grupowania (1) czy to
rekord źródłowy (0)
SELECT GROUPING(Produkt)
• GROUPING_ID() zwraca maskę bitową kolumn, które nie zostały użyte
w grupowaniu
SELECT GROUPING_ID(Produkt, Rok, Miesiac, Dzien)
CUBE i ROLLUP
• Skracają pisanie wszystkich kombinacji GROUPING SETS
• CUBE tworzy zbiór wszystkich możliwych kombinacji kolumn (2^N)
• ROLLUP traktuje kolejne kolumny jako hierarchię (N + 1(TOTAL))
• Obowiązująca składnia:
• GROUP BY ROLLUP (<kolumny>)
• GROUP BY CUBE (<kolumny>)
• Wycofywana składnia:
• GROUP BY <kolumny> WITH ROLLUP
• GROUP BY <kolumny> WITH CUBE
Pytania?

More Related Content

Viewers also liked

mimi kate
mimi katemimi kate
mimi katektrinn
 
Daniel Orsino Professional Persona Presentation
Daniel Orsino Professional Persona PresentationDaniel Orsino Professional Persona Presentation
Daniel Orsino Professional Persona PresentationDaniel Orsino
 
Introduccion portugues avaliação de projetos
Introduccion portugues avaliação de projetosIntroduccion portugues avaliação de projetos
Introduccion portugues avaliação de projetosAlessandro Santos
 
ISRO Summer Internship 2016 Project (3)
ISRO Summer Internship 2016 Project (3)ISRO Summer Internship 2016 Project (3)
ISRO Summer Internship 2016 Project (3)PRANAV CHATURVEDI
 
Gerencia E-learning - PACIE - Fase I
Gerencia E-learning - PACIE - Fase IGerencia E-learning - PACIE - Fase I
Gerencia E-learning - PACIE - Fase Irattur
 
Mora en Aportes Patronales, Mora Pago Licencia
Mora en Aportes Patronales, Mora Pago LicenciaMora en Aportes Patronales, Mora Pago Licencia
Mora en Aportes Patronales, Mora Pago LicenciaCendap Ltda
 
Programacion16 al 20 Mayo
Programacion16 al 20 MayoProgramacion16 al 20 Mayo
Programacion16 al 20 Mayodarioc77
 
Tennis Cambodia
Tennis CambodiaTennis Cambodia
Tennis CambodiaASTENNIS
 
ATF Asian 14&U Circuit
ATF Asian 14&U CircuitATF Asian 14&U Circuit
ATF Asian 14&U CircuitASTENNIS
 

Viewers also liked (13)

mimi kate
mimi katemimi kate
mimi kate
 
Daniel Orsino Professional Persona Presentation
Daniel Orsino Professional Persona PresentationDaniel Orsino Professional Persona Presentation
Daniel Orsino Professional Persona Presentation
 
Introduccion portugues avaliação de projetos
Introduccion portugues avaliação de projetosIntroduccion portugues avaliação de projetos
Introduccion portugues avaliação de projetos
 
ISRO Summer Internship 2016 Project (3)
ISRO Summer Internship 2016 Project (3)ISRO Summer Internship 2016 Project (3)
ISRO Summer Internship 2016 Project (3)
 
stv
stvstv
stv
 
Gerencia E-learning - PACIE - Fase I
Gerencia E-learning - PACIE - Fase IGerencia E-learning - PACIE - Fase I
Gerencia E-learning - PACIE - Fase I
 
Bioquimik
BioquimikBioquimik
Bioquimik
 
APRO COMPANY ASDDTP
APRO COMPANY ASDDTPAPRO COMPANY ASDDTP
APRO COMPANY ASDDTP
 
Mora en Aportes Patronales, Mora Pago Licencia
Mora en Aportes Patronales, Mora Pago LicenciaMora en Aportes Patronales, Mora Pago Licencia
Mora en Aportes Patronales, Mora Pago Licencia
 
Programacion16 al 20 Mayo
Programacion16 al 20 MayoProgramacion16 al 20 Mayo
Programacion16 al 20 Mayo
 
Tennis Cambodia
Tennis CambodiaTennis Cambodia
Tennis Cambodia
 
ATF Asian 14&U Circuit
ATF Asian 14&U CircuitATF Asian 14&U Circuit
ATF Asian 14&U Circuit
 
Fracciones
FraccionesFracciones
Fracciones
 

More from Bartosz Ratajczyk

SQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiSQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiBartosz Ratajczyk
 
OLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastOLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastBartosz Ratajczyk
 
Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?Bartosz Ratajczyk
 
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processSqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processBartosz Ratajczyk
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbaćBartosz Ratajczyk
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISBartosz Ratajczyk
 
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534Bartosz Ratajczyk
 
Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Bartosz Ratajczyk
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Bartosz Ratajczyk
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowaneBartosz Ratajczyk
 
Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Bartosz Ratajczyk
 

More from Bartosz Ratajczyk (16)

SQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiSQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze kroki
 
OLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastOLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fast
 
Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?
 
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processSqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSIS
 
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
 
Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowane
 
Po co mi Temporal Tables?
Po co mi Temporal Tables?Po co mi Temporal Tables?
Po co mi Temporal Tables?
 
O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?
 
Alerty WMI
Alerty WMIAlerty WMI
Alerty WMI
 
Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?
 

Co to te CTE?

  • 1. Co to te CTE? I jak zrobić PIVOT? (oraz słów kilka o GROUPING SETS) 90. Spotkanie PLSSUG Warszawa, 08.10.2015
  • 2. O czym będzie? • Co to CTE, a przede wszystkim jak działa rekurencja w CTE? • Jak obracać dane, czyli PIVOT i UNPIVOT na kilka sposobów • Grupowanie wielopoziomowe, czyli GROUPING SETS
  • 3. O mnie Bartosz Ratajczyk programista baz danych (i aplikacji) czasem też administrator trener T-SQL, ETL, C#, PHP, JS, SAS 4GL http://bartekr.net | b.ratajczyk@gmail.com MCTS SQL Server 2008, MCSA SQL Server 2012, MCT
  • 5. Table expressions Nazwane zapytania, które możemy traktować tak samo jak tabele Nieutrwalone Utrwalone Derived table View Common Table Expression Table Valued Function
  • 6. Jak wygląda CTE? -- pokaż sprzedaż pracowników w danym miesiącu ;WITH Dane AS ( SELECT Pracownik = p.nazwa, Produkt = pr.nazwa, RokMiesiac = YEAR(s.data_sprzedazy) * 100 + MONTH(s.data_sprzedazy), s.ilosc, s.wartosc FROM Sprzedaz s INNER JOIN Pracownik p ON p.id = s.pracownik_id INNER JOIN Produkt pr ON pr.id = s.produkt_id ) SELECT * FROM Dane
  • 7. CTE z nazwami kolumn -- pokaż sprzedaż pracowników w danym miesiącu ;WITH Dane (Pracownik, Produkt, RokMiesiąc, Ilość, Wartość) AS ( SELECT Pracownik = p.nazwa, Produkt = pr.nazwa, RokMiesiac = YEAR(s.data_sprzedazy) * 100 + MONTH(s.data_sprzedazy), s.ilosc, s.wartosc FROM Sprzedaz s INNER JOIN Pracownik p ON p.id = s.pracownik_id INNER JOIN Produkt pr ON pr.id = s.produkt_id ) SELECT * FROM Dane
  • 8. A ta rekurencja? ;WITH Poziomy AS ( SELECT <kolumny> FROM Pracownik p WHERE przelozony_id IS NULL UNION ALL SELECT <kolumny> FROM Pracownik p INNER JOIN Poziomy po ON po.pracownik_id = p.przelozony_id ) SELECT * FROM Poziomy
  • 9. Rekurencja • Rekurencja w programowaniu: funkcja wywołuje samą siebie • Rekurencja w SQL: zapytanie wywołuje samo siebie Różnica między iteracją a rekurencją? Iteracja: 55 = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 Rekurencja: 55 = 10 + (Suma liczb od 1 do 9) 55 = 10 + 9 + (Suma liczb od 1 do 8) 55 = 10 + (9 + (8 + (7 + (6 + (5 + (4 + (3 + (2 + (1)))))))))
  • 10. DEMO
  • 12. Ma to jakieś ograniczenia albo wady? • CTE vs funkcja (32 poziomy) • MAXRECURSION X vs MAXRECURSION 0 • Widoczność tylko dla następnego zapytania • Trudniej testować niż derived tables • Każde odwołanie do CTE to jego wywołanie od zera (nie dotyczy rekurencji)
  • 13. Obracanie danych Czyli PIVOT, UNPIVOT i inne konstrukcje
  • 14. Jak wygląda polecenie PIVOT (i dlaczego tak?) SELECT Pracownik, Produkt, [201401], [201402], [201403], [201404], [201405], [201406], [201407], [201408], [201409], [201410], [201411], [201412] FROM Dane PIVOT ( SUM(ilosc) FOR RokMiesiac IN ( [201401], [201402], [201403], [201404], [201405], [201406], [201407], [201408], [201409], [201410], [201411], [201412] ) ) p
  • 15. No ale dlaczego tak? • Jaich informacji potrzebujemy do obrócenia danych z wierszy na kolumny: • Po czym grupujemy? • Z której kolumny bierzemy atrybuty? • Które wartości nas interesują? • I jak je zliczać? A jak to przełożyć na kod – za chwilę
  • 16. DEMO
  • 17. To całkiem niezłe, ale ma ograniczenia • Tylko jedna funkcja agregująca w konstrukcji PIVOT • Muszę znać nazwy kolumn i podać je wprost Zgadza się, ale można to obejść
  • 18. DEMO
  • 19. To teraz w drugą stronę – z kolumn na wiersze SELECT Pracownik, Produkt, RokMiesiac, Wartosc FROM SprzedazPivot UNPIVOT ( Wartosc FOR RokMiesiac IN ( [201401], [201402], [201403], [201404], [201405], [201406], [201407], [201408], [201409], [201410], [201411], [201412] ) ) u
  • 20. To znowu – dlaczego tak? • Jakich informacji potrzebujemy do zmiany kolumn na wiersze: • Które kolumny mają trafić jako wiersze? • Jak się ma nazywać kolumna, która będzie trzymała nazwy kolumn? • Jak ma się nazywać kolumna z wartościami z tych kolumn?
  • 21. DEMO
  • 22. Ten UNPIVOT tez ma wady • Też muszę podać nazwy tych wszystkich kolumn? Tak, ale wiesz już jak to obejść • Nie da się obrócić więcej niż jednego zestawu kolumn Ale na to też jest sposób
  • 23. DEMO
  • 25. Co to GROUPING SET? • To po prostu zestaw wyrażeń, po których grupujemy Czyli pisząc tak: GROUP BY Produkt, Rok, Miesiac, Dzien Możemy napisać tak: GROUP BY GROUPING SETS ( (Produkt, Rok, Miesiac, Dzien) ) (ale wyjdzie dłużej)
  • 26. No rewelacja, a daje to coś więcej? • Oczywiście – możemy podać kilka zestawów na raz GROUP BY GROUPING SETS ( (Produkt, Rok, Miesiac, Dzien), (Produkt, Rok), (Produkt, Rok, Miesiac), ()-- <-- TOTAL )
  • 27. DEMO
  • 28. GROUPING() i GROUPING_ID() • GROUPING() sprawdza, czy rekord pochodzi z grupowania (1) czy to rekord źródłowy (0) SELECT GROUPING(Produkt) • GROUPING_ID() zwraca maskę bitową kolumn, które nie zostały użyte w grupowaniu SELECT GROUPING_ID(Produkt, Rok, Miesiac, Dzien)
  • 29. CUBE i ROLLUP • Skracają pisanie wszystkich kombinacji GROUPING SETS • CUBE tworzy zbiór wszystkich możliwych kombinacji kolumn (2^N) • ROLLUP traktuje kolejne kolumny jako hierarchię (N + 1(TOTAL)) • Obowiązująca składnia: • GROUP BY ROLLUP (<kolumny>) • GROUP BY CUBE (<kolumny>) • Wycofywana składnia: • GROUP BY <kolumny> WITH ROLLUP • GROUP BY <kolumny> WITH CUBE