www.comarch.pl/szkolenia Operacja PIVOT w języku SQL w środowisku Oracle 21.11.2012



Podobne dokumenty
bazy danych - heterogeniczność producenci funkcjonalność modele danych protokoły komunikacyjne

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

SQL do zaawansowanych analiz danych część 1.

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

OLAP i hurtownie danych c.d.

Klasyczna Analiza Danych

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Paweł Rajba

Oracle11g: Wprowadzenie do SQL

Relacyjne bazy danych. Podstawy SQL

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

Język SQL podstawy zapytań

Microsoft SQL Server Podstawy T-SQL

Bazy danych 10. SQL Widoki

Relacyjne bazy danych. Podstawy SQL

SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop Spis treści

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Oracle PL/SQL. Paweł Rajba.

Grupowanie i funkcje agregujące

Bazy danych. dr inż. Arkadiusz Mirakowski

15. Funkcje i procedury składowane PL/SQL

Tworzenie zapytań do Microsoft SQL Server

Pakiety podprogramów Dynamiczny SQL

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

LAB 3 (część 1 Projektu)

Oracle PL/SQL. Paweł Rajba.

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

Spis treści. Przedmowa

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Modelowanie wymiarów

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Język PL/SQL Pakiety podprogramów

Bazy danych SQL Server 2005

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

PODZAPYTANIE (SUBSELECT)

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Język SQL, zajęcia nr 2

Zaawansowane bazy danych i hurtownie danych semestr I

Model semistrukturalny

PODSTAWY BAZ DANYCH 13. PL/SQL

Bloki anonimowe w PL/SQL

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Technologie baz danych WYKŁAD 7: Wyjątki

Wykład 5. SQL praca z tabelami 2

Tworzenie raportów XML Publisher przy użyciu Data Templates

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wykład IV Modelowanie danych, projektowanie systemu informatycznego Modelowanie konceptualne implementacyjne Modelowanie pojęciowe na encjach

EGZAMIN MATURALNY OD ROKU SZKOLNEGO

Oracle PL/SQL. Paweł Rajba.

Nauczycielem wszystkiego jest praktyka Juliusz Cezar. Nauka to wiara w ignorancję ekspertów Richard Feynman

Zarzadzanie transakcjami. Transakcje

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Przydatne sztuczki - sql. Na przykładzie postgres a.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Bazy danych. Polecenia SQL

Procedury i funkcje składowane

Systemy GIS Tworzenie zapytań w bazach danych

Rozszerzenia grupowania

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Wstęp Wprowadzenie do BD Podstawy SQL. Bazy Danych i Systemy informacyjne Wykład 1. Piotr Syga

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Bazy Danych i Usługi Sieciowe

Grupowanie danych klauzula GROUP BY

Wykład 8. SQL praca z tabelami 5

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Bazy danych wykład trzeci. Konrad Zdanowski

Bazy danych 6. Klucze obce. P. F. Góra

SQL do zaawansowanych analiz danych część 1.

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

SQL (ang. Structured Query Language)

Część 1: OLAP. Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych

Cechy języka XQUERY. o na wejściu dokument lub fragment względnie kolekcja dokumentów lub fragmentów o na wyjściu dokument lub fragment.

SQL - Structured Query Language. strukturalny język zapytań

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Bazy danych 7. SQL dalsze możliwości. Grupowanie.

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

STROJENIE PRZETWARZAŃ SAS

Bazy danych i usługi sieciowe

Wykład 05 Bazy danych

Język SQL. Rozdział 2. Proste zapytania

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Wyświetl imie i nazwisko ucznia, nazwę przedmiotu z którego otrzymał ocenę niedostateczną. Nazwij tę kwerendę oceny niedostateczne.

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Funkcje. Rozdział 3a Funkcje wierszowe. Funkcje znakowe (1) Funkcje wierszowe

Transkrypt:

Operacja PIVOT w języku SQL w środowisku Oracle 21.11.2012

Zakres Wprowadzenie Idea przestawiania danych Możliwe zastosowania Przestawianie danych bez klauzuli PIVOT Konstrukcja klauzuli Korzyści ze stosowania PIVOT Przykłady działania PIVOT z klauzulą WITH Klauzula UNPIVOT Ograniczenia stosowania PIVOT i opcja XML Podsumowanie

Wprowadzenie W relacyjnych bazach danych dane przedstawiane są w postaci tabel. Sposób składowania danych bezpośrednio wpływa na sposób, w jaki można na nich operować. Często, aby lepiej przeanalizować dane należało zaprezentować je w innej, wygodniejszej postaci. W ten sposób można wydobyć informacje na temat trendów w zmiana danych (trendów sprzedaży, kosztów itp.

Przestawianie danych

Przestawianie danych

Obracanie w Oracle 10g przykład 1 SELECT * FROM ( SELECT kategoria, SUM(DECODE(kwartal,1,ilosc Q1, SUM(DECODE(kwartal,2,ilosc Q2, SUM(DECODE(kwartal,3,ilosc Q3, SUM(DECODE(kwartal,4,ilosc Q4 FROM sprzedaz2011 GROUP BY kategoria ORDER BY kategoria; KATEGORIA Q1 Q2 Q3 Q4 --------------- --- --- --- --- AGD 100 110 90 140 komputery 130 120 120 150 RTV 150 150 180 190 telefony 250 300 330 300 KWARTAL KATEGORIA ILOSC ---------- --------------- ------ 1 AGD 125 1 komputery 162 1 RTV 187 1 telefony 312 2 AGD 137 2 komputery 150 2 RTV 187 2 telefony 375 3 AGD 112 3 komputery 150 3 RTV 225 3 telefony 412 4 AGD 175 4 komputery 187 4 RTV 237 4 telefony 375

Obracanie w Oracle 10g przykład 2 SELECT * FROM ( SELECT kategoria, SUM(CASE WHEN kwartal = 1 THEN ilosc END Q1, SUM(CASE WHEN kwartal = 2 THEN ilosc END Q2, SUM(CASE WHEN kwartal = 3 THEN ilosc END Q3, SUM(CASE WHEN kwartal = 4 THEN ilosc END Q4 FROM sprzedaz2011 GROUP BY kategoria ORDER BY kategoria; KATEGORIA Q1 Q2 Q3 Q4 --------------- --- --- --- --- AGD 100 110 90 140 komputery 130 120 120 150 RTV 150 150 180 190 telefony 250 300 330 300

PIVOT Operacja umożliwiająca restrukturyzację danych do innej postaci - do formatu, w jakim łatwiej będzie dane przetwarzać lub analizować. Przestawianie kolumn na miejsce wierszy lub odwrotnie. Jednocześnie wykonywane są operacje agregujące (np. sumowanie, obliczanie średniej. Operacje przydatne, gdy chcemy obserwować np. trendy sprzedaży w czasie.

PIVOT SELECT... FROM... PIVOT ( pivot_clause pivot_for_clause pivot_in_clause WHERE... pivot_clause definiowanie kolumn do agregacji (Pivot jest operacją agregującą pivote_for_clause definiowanie kolumn do grupowania i obrotu pivote_in_clause definiowanie filtru dla kolumny (kolumn z klauzuli pivote_for_clause (zakres wartości ograniczającej wyniki

PIVOT przykład 1a SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1,2,3,4; KATEGORIA 1 2 3 4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

PIVOT przykład 1b SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

ID PRODUKT KATEGORIA DATA_SPRZ CENA R ---------- ------------------------- --------------- --------- ---------- - 1 TV Samsung LCD 50" RTV 02-JAN-11 3500 N 2 Pralka Bosch" AGD 02-JAN-11 1200 N 3 TV Sony LCD 40" RTV 03-JAN-11 2500 T 4 Lodówka Amica AGD 10-JAN-11 1500 T 5 Netbook Lenovo 12" Komputery 15-JAN-11 1700 N 6 Pralka Candy AGD 17-JAN-11 1300 N 7 Netbook Lenovo 10" Komputery 18-JAN-11 1200 N 8 Notebook Samnsung 15" Komputery 22-JAN-11 2200 N 9 TV Panasonic 32" TV 26-JAN-11 2000 N 10 Nokia Lumnia 800 Telefony 29-JAN-11 1200 N 11 TV Samsung LCD 40" RTV 01-FEB-11 3000 T 12 Zmywarka Bosch AGD 05-FEB-11 1300 T 13 TV Sony LCD 50" RTV 05-FEB-11 4500 N 14 Okap Mastercook AGD 09-FEB-11 1000 T 15 Samsung Galaxy S Telefony 11-FEB-11 1700 N 16 Sony Xperia Telefony 18-FEB-11 1100 T 17 Netbook Lenovo 10" Komputery 18-FEB-11 1200 T 18 Okap Amica AGD 23-FEB-11 1200 T 19 Samsung Galaxy S Telefony 24-FEB-11 1300 N 20 Nokia Lumnia 800 Telefony 26-FEB-11 1000 N 21 Apple IPhone 3 Telefony 27-FEB-11 1200 N 22 TV Panasonic 50" RTV 27-FEB-11 3200 N 23 Apple iphone 3 Telefony 01-MAR-11 3000 T 24 Netbook Samsung 10" Komputery 02-MAR-11 1300 T 25 TV Samsung LCD 40" RTV 04-MAR-11 4500 N 26 Apple iphone 3 Telefony 05-MAR-11 1000 T 27 Samsung Galaxy S Telefony 12-MAR-11 1700 N 28 Sony Xperia Telefony 16-MAR-11 1100 T

Przykład 2a jedna agregacja SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, id FROM sprzedaz2011_detal PIVOT (COUNT(id FOR miesiac IN ('01' AS STY,'02' AS LUT,'03' AS MAR; KATEGORIA STY LUT MAR --------------- ---------- ---------- ---------- RTV 3 4 5 AGD 3 3 2 Komputery 3 1 2 Telefony 1 5 7

Przykład 2a jedna agregacja SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, id FROM sprzedaz2011_detal PIVOT (COUNT(id FOR miesiac IN (01 AS STY,02 AS LUT,03 AS MAR; KATEGORIA STY LUT MAR --------------- ---------- ---------- ---------- RTV 0 0 0 AGD 0 0 0 Komputery 0 0 0 Telefony 0 0 0

Przykład 2b dwie agregacje SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, id, cena FROM sprzedaz2011_detal PIVOT (COUNT(id ilosc, SUM(cena zysk FOR miesiac IN ('01' AS STY,'02' AS LUT,'03' AS MAR; KATEGORIA STY_ILOSC STY_ZYSK LUT_ILOSC LUT_ZYSK MAR_ILOSC MAR_ZYSK --------------- ---------- ---------- ---------- ---------- ---------- ---------- RTV 3 8000 4 12900 5 17400 AGD 3 4000 3 3500 2 4400 Komputery 3 5100 1 1200 2 2500 Telefony 1 1200 5 6300 7 12200

Przykład 2b cd. brak kolumny SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, id FROM sprzedaz2011_detal PIVOT (COUNT(id ilosc, SUM(cena zysk FOR miesiac IN ('01' AS STY,'02' AS LUT,'03' AS MAR; ERROR at line 4: ORA-00904: "CENA": invalid identifier

Przykład 2c przestawianie na wielu kolumnach SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, raty, id FROM sprzedaz2011_detal PIVOT (COUNT(id FOR (miesiac, raty IN (('01','N' AS STY_CAL, ('01','T' AS STY_RATY, ('02','N' AS LUT_CAL, ('02','T' AS LUT_RATY, ('03','N' AS MAR_CAL, ('03','T' AS MAR_RATY; KATEGORIA STY_CAL STY_RATY LUT_CAL LUT_RATY MAR_CAL MAR_RATY --------------- ---------- ---------- ---------- ---------- ---------- ---------- RTV 2 1 3 1 3 2 AGD 2 1 0 3 0 2 Komputery 3 0 0 1 0 2 Telefony 1 0 4 1 2 5

Przykład 3a lokalizacja zapytania: podzapytanie inline view SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

Przykład 3b pełny select błędne wyniki SELECT * FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; ID KATEGORIA 1 2 3 4 ---------- --------------- ---------- ---------- ---------- ---------- 2 AGD 100 4 telefony 250 11 komputery 120 14 AGD 140 15 komputery 150 6 AGD 110 9 RTV 180 16 telefony 300 5 RTV 150 1 RTV 150 8 telefony 300 12 telefony 330 3 komputery 130 7 komputery 120 10 AGD 90 13 RTV 190

Przykład 3c wybieranie kolumn w zapytani głównym - błąd SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; ERROR at line 1: ORA-00904: "ILOSC": invalid identifier

Przykład 3d subquery factoring WITH pivot_data AS ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 SELECT * FROM pivot_data PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

Przykład 3e lokalizacja zapytania: podzapytanie view CREATE OR REPLACE VIEW v_sprzedaz2011 AS SELECT kategoria, kwartal, ilosc FROM sprzedaz2011; SELECT * FROM v_sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

Przykład 4a sortowanie SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 ORDER BY kategoria PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

Przykład 4b sortowanie SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4 ORDER BY kategoria; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- AGD 100 110 90 140 RTV 150 150 180 190 komputery 130 120 120 150 telefony 250 300 330 300

Przykład 5a zaokrąglanie wyników SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, cena FROM sprzedaz2011_detal PIVOT (AVG(cena srednia_cena FOR miesiac IN ('01' AS STY,'02' AS LUT; KATEGORIA STY_SREDNIA_CENA LUT_SREDNIA_CENA --------------- ---------------- ---------------- RTV 2666.66667 3225 AGD 1333.33333 1166.66667 Komputery 1700 1200 Telefony 1200 1260

Przykład 5b zaokrąglanie wyników SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, cena FROM sprzedaz2011_detal PIVOT (ROUND(AVG(cena,2 srednia_cena FOR miesiac IN ('01' AS STY,'02' AS LUT; ERROR at line 4: ORA-56902: expect aggregate function inside pivot operation

Przykład 5c zaokrąglanie wyników SELECT kategoria, round(sty_srednia_cena,2 AS sty_srednia_cena, round(lut_srednia_cena,2 AS lut_srednia_cena FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, cena FROM sprzedaz2011_detal PIVOT (AVG(cena srednia_cena FOR miesiac IN ('01' AS STY,'02' AS LUT; KATEGORIA STY_SREDNIA_CENA LUT_SREDNIA_CENA --------------- ---------------- ---------------- RTV 2666.67 3225 AGD 1333.33 1166.67 Komputery 1700 1200 Telefony 1200 1260

Przykład 6a łączenie tabel SELECT * FROM ( SELECT kategoria, TO_CHAR(data_sprzedazy,'MM' miesiac, odbior, s.id FROM sprzedaz2011_detal s JOIN transakcje t ON (s.id=t.id PIVOT (COUNT(id FOR (miesiac, odbior IN (('01','OSOBISTY' AS STY_OSO, ('01','KURIER' AS STY_KUR, ('02','OSOBISTY' AS LUT_OSO, ('02','KURIER' AS LUT_KUR, ('03','OSOBISTY' AS MAR_OSO, ('03','KURIER' AS MAR_KUR; KATEGORIA STY_OSO STY_KUR LUT_OSO LUT_KUR MAR_OSO MAR_KUR --------------- ---------- ---------- ---------- ---------- ---------- ---------- RTV 2 1 4 0 0 5 AGD 2 1 1 2 2 0 Komputery 3 0 1 0 1 1 Telefony 0 1 2 3 3 4

Przykład 6b łączenie tabel SELECT * FROM ( SELECT TO_CHAR(data_sprzedazy,'MM' miesiac, odbior, s.id FROM sprzedaz2011_detal s JOIN transakcje t ON (s.id=t.id PIVOT (COUNT(id FOR (miesiac, odbior IN (('01','OSOBISTY' AS STY_OSO, ('01','KURIER' AS STY_KUR, ('02','OSOBISTY' AS LUT_OSO, ('02','KURIER' AS LUT_KUR, ('03','OSOBISTY' AS MAR_OSO, ('03','KURIER' AS MAR_KUR; STY_OSO STY_KUR LUT_OSO LUT_KUR MAR_OSO MAR_KUR ---------- ---------- ---------- ---------- ---------- ---------- 7 3 8 5 6 10

Przykład 7a Podsumowania SELECT x.*, Q1+Q2+Q3+Q4 AS rocznie FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4 x; KATEGORIA Q1 Q2 Q3 Q4 ROCZNIE --------------- ---------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 520 telefony 250 300 330 300 1180 RTV 150 150 180 190 670 AGD 100 110 90 140 440

Przykład 7b Podsumowania SELECT nvl(kategoria,'sum_kwartaly' AS kategoria, nvl(q1,sum(q1 OVER( AS Q1, nvl(q2,sum(q2 OVER( AS Q2, nvl(q3,sum(q3 OVER( AS Q3, nvl(q4,sum(q4 OVER( AS Q4, sum_kategorie FROM ( SELECT kategoria, NVL(to_char(kwartal,'rocznie' AS kw, sum(ilosc AS il FROM sprzedaz2011 GROUP BY ROLLUP (kategoria, kwartal PIVOT (SUM(il FOR kw IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4, 'rocznie' AS sum_kategorie;

Przykład 7b Podsumowania KATEGORIA Q1 Q2 Q3 Q4 SUM_KATEGORIE --------------- --- --- --- --- ------------- AGD 100 110 90 140 440 RTV 150 150 180 190 670 komputery 130 120 120 150 520 telefony 250 300 330 300 1180 sum_kwartaly 630 680 720 780 2810

UNPIVOT przykład 1a CREATE VIEW v_sprzedaz2011_pivoted AS SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4;

UNPIVOT przykład 1b SELECT * FROM v_sprzedaz2011_pivoted UNPIVOT ( ilosc FOR kwartal IN (Q1, Q2, Q3, Q4 ; KATEGORIA KW ILOSC --------------- -- ---------- komputery Q1 130 komputery Q2 120 komputery Q3 120 komputery Q4 150 telefony Q1 250 telefony Q2 300 telefony Q3 330 telefony Q4 300 RTV Q1 150 RTV Q2 150 RTV Q3 180 RTV Q4 190 AGD Q1 100 AGD Q2 110 AGD Q3 90 AGD Q4 140 KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- AGD 100 110 90 140 RTV 150 150 180 190 komputery 130 120 120 150 telefony 250 300 330 300

PIVOT i UNPIVOT ograniczenia Nie ma możliwości wybierania na liście SELECT kolumn, które znajdują się na klauzuli pivot_clause. ORA-00904: kolumna": invalid identifier Nie ma możliwości wybierania na liście SELECT kolumn, które znajdują się na klauzuli pivot_for_clause. ORA-00904: kolumna": invalid identifier Na klauzuli pivot_clause musi znaleźć się funkcja agregująca. ORA-56902: expect aggregate function inside pivot operation

PIVOT i lista wartości PIVOT działa prawidłowo dla podanej listy wartości w klauzuli pivot_in_clause Fakt, że lista wartości musi być podana na sztywno utrudnia stosowanie PIVOT Nie ma możliwości umieszczenia w pivot_in_clause podzapytania

SELECT * FROM ( PIVOT i lista wartości przykład 1a SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT (SUM(ilosc FOR kwartal IN (SELECT kwartal FROM sprzedaz2011; SQL Error: ORA-00936: brak wyrażenia 00936. 00000 - "missing expression"

SELECT * FROM ( PIVOT i lista wartości przykład 1b SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT XML (SUM(ilosc FOR kwartal IN (ANY; Rezultat dostarczany jest w formacie XML Wyniki obejmują wszystkie istniejące wartości w polach danych

PIVOT i lista wartości przykład 1b cd. KATEGORIA KWARTAL_XML --------- ----------------------------------------------------------------- AGD <PivotSet><item><column name = "KWARTAL">1</column><column name = "SUM(ILOSC">100</column></item><item><column name = "KWARTAL">2</column><column name = "SUM(ILOSC">110</column></item><item><column name = "KWARTAL">3</column><column name = "SUM(ILOSC">90</column></item><item><column name = "KWARTAL">4</column><column name = "SUM(ILOSC">140</column></item></PivotSet> RTV <PivotSet><item><column name = "KWARTAL">1</column><column name = "SUM(ILOSC">150</column></item><item><column name = "KWARTAL">2</column><column name = "SUM(ILOSC">150</column></item><item><column name = "KWARTAL">3</column><column name = "SUM(ILOSC">180</column></item><item><column name = "KWARTAL">4</column><column name = "SUM(ILOSC">190</column></item></PivotSet> Komputery <PivotSet><item><column name = "KWARTAL">1</column><column name = "SUM(ILOSC">130</column></item><item><column name = "KWARTAL">2</column><column name = "SUM(ILOSC">120</column></item><item><column name = "KWARTAL">3</column><column name = "SUM(ILOSC">120</column></item><item><column name = "KWARTAL">4</column><column name = "SUM(ILOSC">150</column></item></PivotSet> telefony <PivotSet><item><column name = "KWARTAL">1</column><column name = "SUM(ILOSC">250</column></item><item><column name = "KWARTAL">2</column><column name = "SUM(ILOSC">300</column></item><item><column name = "KWARTAL">3</column><column name = "SUM(ILOSC">330</column></item><item><column name = "KWARTAL">4</column><column name = "SUM(ILOSC">300</column></item></PivotSet>

Możliwy jest zapis z podzapytaniem: PIVOT i lista wartości przykład 1c SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT XML (SUM(ilosc FOR kwartal IN (SELECT kwartal FROM sprzedaz2011; Wyniki obejmują wszystkie wartości w polach danych, nie tylko istniejące (również komórki puste

PIVOT i lista wartości przykład 1c Wyniki zapytania są w formacie XMLTYPE. Można te dane przetwarzać za pomocą wyrażeń XPath lub XQuery Można również wyciągać poszczególne elementy SELECT kategoria, EXTRACT(kwartal_xml, '/PivotSet/item/column' AS ilosc FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011 PIVOT XML (SUM(ilosc FOR kwartal IN (ANY WHERE kategoria like '%RTV%';

PIVOT i lista wartości przykład 1b cd. KATEGORIA ILOSC --------- ----------------------------------------------------------------- RTV <column name="kwartal">1</column><column name="sum(ilosc">150</column> <column name="kwartal">2</column><column name="sum(ilosc">150</column> <column name="kwartal">3</column><column name="sum(ilosc">180</column> <column name="kwartal">4</column><column name="sum(ilosc">190</column>

Klauzula Pivot a dane z CSV Klauzula Pivot może pracować na plikach tekstowych. Plik musi zostać wcześniej podłączony do bazy, za pomocą opcji external table. Dalsze operacje nie różnią się od przypadku, gdy tabela jest składowana w bazie

Klauzula Pivot a dane z CSV CREATE TABLE sprzedaz2011_ext ( id NUMBER(4, kwartal NUMBER(2, kategoria VARCHAR2(15, ilosc NUMBER(4 ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY data_imp ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE BADFILE 'bad' LOGFILE 'log' SKIP 1 FIELDS TERMINATED BY ';' ( id,kwartal,kategoria,ilosc LOCATION ('sprzedaz2011.csv' ;

Klauzula Pivot a dane z CSV SELECT * FROM ( SELECT kategoria, kwartal, ilosc FROM sprzedaz2011_ext PIVOT (SUM(ilosc FOR kwartal IN (1 AS Q1, 2 AS Q2, 3 AS Q3, 4 AS Q4; KATEGORIA Q1 Q2 Q3 Q4 --------------- ---------- ---------- ---------- ---------- komputery 130 120 120 150 telefony 250 300 330 300 RTV 150 150 180 190 AGD 100 110 90 140

Podsumowanie Zasady użycia: Miejsce w składni SELECT Użycie widoków inline lub klauzuli WITH Konieczność podania listy wartości lub użycia XML Korzyści Łatwość zapisu w porównaniu do CASE lub DECODE Zwartość zapisu Możliwość generowania danych XML Obustronność operacji (PIVOT, UNPIVOT Łatwość przestawiania danych na wielu kolumnach oraz z wieloma agregacjami

Promocje PROMOCJE do wykorzystania dla uczestników w terminie do 31 stycznia 2013 roku*. SQL język dostępu do bazy danych Oracle - w cenie specjalnej - 700 zł 30% rabatu na szkolenie: SQL poziom zaawansowany. * Przy rejestracji do 17.12.2012 dodatkowe nagrody książkowe

Dziękuję za uwagę