Kimutatást tartalmazó lekérdezések írása és eredményhalmazok feloldása

Befejeződött

Az SQL Server kimutatásával elforgathatja az adatok megjelenítési módját a sorokon alapuló tájolástól az oszlopokon alapuló tájolásig. A kimutatáskor egy oszlop értékeit összevonja egy különböző értékek listájával, majd a listát oszlopfejlécekként vetíti ki. Ez általában magában foglalja az új oszlopok oszlopértékeinek összesítését.

Az alábbi részleges forrásadatok például a Kategória és az Orderyear ismétlődő értékeit, valamint a Qty értékeit sorolják fel egy Kategória/Rendelésév pár minden példányához:

Kategória Mennyiség Rendelési év
Tejtermékek 12 2019
Magok/gabonafélék 10 2019
Tejtermékek 5 2019
Tengeri 2 2020
Édesség 36 2020
Fűszerek 35 2020
Édesség 55 2020
Fűszerek 16 2020
Tejtermékek 60 2020
Tejtermékek 20 2020
Édesség 24 2020
... (2155 érintett sor(ok)

A fenti táblázat több mint 2000 sort jelöl, sok ismétlődő értékkel. Ha kategória és év szerint szeretné elemezni az eredményeket, érdemes lehet a következőképpen rendezni az értékeket, az út mentén összegezve a Qty oszlopot:

Kategória 2019 2020 2021
Italok 1842 3996 3694
Fűszerek 962 2895 1441
Édesség 1357 4137 2412
Tejtermékek 2086 4374 2689
Magok/gabonafélék 549 2636 1377
Hús/baromfi 950 2189 1060
Termel 549 1583 858
Tengeri 1286 3679 2716
(8 sor érintett)

Az eredményhalmaz most összesen nyolc sort jelent. A kimutatási folyamat során minden különálló év oszlopfejlécként lett létrehozva, a Qty oszlop értékei pedig kategóriák szerint lettek csoportosítva és összesítve.

Eredményhalmaz kimutatása a PIVOT használatával

Az eredményhalmazt a PIVOT operátorral forgathatja. A Transact-SQL PIVOT tábla operátor egy Standard kiadás LECT utasítás FROM záradékának kimenetén működik. A PIVOT használatához három elemet kell megadnia az operátornak:

  • Csoportosítás: a FROM záradékban adja meg a bemeneti oszlopokat. Ezekből az oszlopokból a PIVOT határozza meg, hogy melyik oszlop(ok) lesznek használva az összesítés adatainak csoportosításához. Ez azon alapul, hogy mely oszlopokat nem használják más elemként a PIVOT operátorban.
  • Szórás: a kimutatásban szereplő adatok oszlopfejléceként használandó értékek vesszővel tagolt listáját adja meg. Az értékeknek a forrásadatokban kell történnie.
  • Összesítés: a csoportosított sorokon végrehajtandó összesítési függvényt (SZUM stb.) ad meg.

Emellett egy táblaaliast is hozzá kell rendelnie a KIMUTATÁS operátor eredménytáblához. Az alábbi példa a helyben lévő elemeket mutatja be:

SELECT  Category, [2019],[2020],[2021]
FROM  ( SELECT  Category, Qty, Orderyear FROM Sales.CategoryQtyYear) AS D 
          PIVOT(SUM(qty) FOR orderyear IN ([2019],[2020],[2021])) AS pvt;

A fenti példában az Orderyear a szórási értékeket tartalmazó oszlop, a Qty az összesítéshez, a csoportosítás kategóriája . Az orderyear értékek elválasztójelek közé vannak zárva, amelyek azt jelzik, hogy az eredmény oszlopazonosítói.

Eredményhalmaz leválasztása a UNPIVOT használatával

Az adatok leválasztása az adatok kimutatásának logikai fordítottja. A sorok oszlopokká alakítása helyett az oszlopokat nem lehet sorokká alakítani. Ez egy olyan technika, amely akkor hasznos, ha a már elforgatott adatokat (Transact-SQL PIVOT operátorral vagy anélkül) készíti el, és egy sororientált táblázatos megjelenítésre adja vissza. Ehhez használhatja a UNPIVOT tábla operátort.

A UNPIVOT operátor használatához három elemet kell megadnia:

  • A forrásoszlopokat fel kell szabadítani.
  • Az új oszlop neve, amely megjeleníti a meg nem jelenített értékeket.
  • Annak az oszlopnak a neve, amely a meg nem jelenített értékek nevét jeleníti meg.

Az alábbi példa a 2019-et, a 2020-ast és a 2021-et adja meg a visszavonni kívánt oszlopokként az új oszlopnévsorévés az új qty oszlopban megjelenítendő mennyiségértékek használatával.

SELECT category, qty, orderyear
FROM Sales.PivotedCategorySales
UNPIVOT(qty FOR orderyear IN([2019],[2020],[2021])) AS unpvt;

Az adatok törlésekor egy vagy több oszlop lesz definiálva a sorokká konvertálandó forrásként. Az oszlopokban lévő adatok egy vagy több új sorra vannak felosztva vagy felosztva attól függően, hogy hány oszlopot törölnek. A következő forrásadatokban három oszlop lesz leválasztva. Minden Orderyear érték egy új sorba lesz másolva, és hozzá lesz rendelve a kategóriaértékhez. A folyamat során minden NULL el lesz távolítva, és nem jön létre sor:

Kategória 2019 2020 2021
Italok 1842 3996 3694
Fűszerek 962 2895 1441
Édesség 1357 4137 2412
Tejtermékek 2086 374 2689
Magok/gabonafélék 549 2636 1377
Hús/baromfi 950 2189 1060
Termel 549 1583 858
Tengeri 1286 3679 2716

A Kategória és az Orderyear minden metszeténél új sor jön létre, az alábbi részleges eredményekhez hasonlóan:

kategória qty orderyear
Italok 1842 2019
Italok 3996 2020
Italok 3694 2021
Fűszerek 962 2019
Fűszerek 2895 2020
Fűszerek 1441 2021
Édesség 1357 2019
Édesség 4137 2020
Édesség 2412 2021

A leállítás nem állítja vissza az eredeti adatokat. A részletszintű adatok elvesztek az eredeti kimutatás összesítési folyamata során. A UNPIVOT nem tudja lefoglalni az értékeket, hogy visszatérjenek az eredeti részletértékekhez.