Операторът PIVOT се използва за преобразуване на редове в таблицата в колони, докато операторът UNPIVOT преобразува колоните обратно в редове. Обръщането на оператор PIVOT се отнася до процеса на прилагане на оператора UNPIVOT към вече PIVOTED набор от данни, за да се извлече оригиналния набор от данни.
В тази статия ще изучаваме тези три понятия на различни примери.
Оператор PIVOT
Както бе споменато по-рано, операторът PIVOT преобразува редовете на таблицата в колони. Например, ако имате таблица, която изглежда така:
и го завъртете с третата колона, резултатът ще бъде както следва:
В оригиналната таблица имахме две уникални стойности за колоните на курса – английски език и история. В завъртяната таблица тези уникални стойности са преобразувани в колони. Можете да видите, че стойностите на резултата за всяка нова колона остават непроменени. Например в оригиналната таблица ученик Сали е отбелязал 95 точки на английски, за разлика от стойностите в завъртяната таблица.
Както винаги, уверете се, че сте направили сигурно архивиране, преди да направите каквито и да било корекции в жива база данни.
Нека разгледаме този пример за използване на оператора PIVOT в SQL Server.
CREATE DATABASE School GO USE School GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Course VARCHAR (50), Score INT ) GO INSERT INTO Students VALUES ('Sally', 'English', 95 ) INSERT INTO Students VALUES ('Sally', 'History', 82) INSERT INTO Students VALUES ('Edward', 'English', 45) INSERT INTO Students VALUES ('Edward', 'History', 78)
Скриптът по-горе създава училищната база данни. В базата данни създаваме таблица Студенти с четири колони, като Id, StudentName, Course и Score. Накрая добавяме четирите фиктивни записа към таблицата Students.
Сега, ако използвате оператор SELECT, за да извлечете всички записи, ще видите следното:
Нека завъртим тази таблица по колоната Курс. За да направите това, изпълнете следния скрипт:
SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot
Нека видим какво се случва в сценария. В първия ред използваме оператора SELECT, за да дефинираме колоните, които искаме да добавим към завъртяната таблица. Първите две колони са StudentName и Score. Данните за тези две колони ще идват директно от таблицата Студенти. Третата колона е Курс. Искаме да завъртим таблицата си по колоната Курс, следователно колоната Курс ще бъде разделена на броя колони, равен на стойностите, посочени от оператора PIVOT за колоната Курс.
Синтаксисът за оператора PIVOT е прост. Първо, трябва да приложите агрегатна функция към колоната, чиито стойности искате да покажете в завъртяните колони. В нашия случай искаме да покажем резултата в завъртяните колони – Английски и История. И накрая, ние използваме оператор FOR, за да посочим основната колона и уникалните стойности в нея. Резултатът изглежда така:
Оператор UNPIVOT
Операторът UNPIVOT се използва за преобразуване на колони на таблицата в редове. Например, ако имате таблица, която изглежда така:
Операторът UNPIVOT ще върне следните резултати:
Колоните на оригиналната таблица са преобразувани в редовете в таблицата без завъртане. Нека използваме тези данни, за да видим как работи операторът UNPIVOT в SQL.
За да направите това, изпълнете следния скрипт:
CREATE DATABASE School2 GO USE School2 GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Math INT, English INT, History INT, Science INT ) GO INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 ) INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)
Ако изберете данните от таблицата Students на базата данни School2, ще видите следните резултати:
За да приложите оператора UNPIVOT към тази таблица, изпълнете следната заявка:
SELECT StudentName, Course, Score FROM Students UNPIVOT ( Score FOR Course in (Math, English, History, Science) ) AS SchoolUnpivot
Синтаксисът на оператора UNPIVOT е подобен на PIVOT. В оператора SELECT трябва да посочите колоните, които искате да добавите към изходната таблица. В оператора UNPIVOT ще посочите две колони:
- Първата колона съдържа стойностите от редовете на завъртяните колони (което в този случай е резултат).
- Втората колона включва имената на завъртяните колони, т.е. математика, английски език, история и наука.
Изходната таблица ще изглежда така:
Обръщане на PIVOT
Обръщането на оператор PIVOT се отнася до процеса на прилагане на оператор UNPIVOT към завъртяна таблица, за да се върнете към оригиналната таблица.
Обръщане на неагрегирана завъртяна таблица
Обръщането на оператор PIVOT е възможно само ако завъртяната таблица не съдържа обобщени данни.
Нека да разгледаме таблицата, която използвахме в раздела PIVOT на тази статия.
Виждате, че няма повтарящи се редове. С други думи, можем да кажем, че за всеки студент има само един запис на курс. Например Сали има само един рекорд за резултата си в курса по английски език.
Когато приложихме оператора PIVOT към горната таблица, получихме следния резултат:
Сега ще приложим оператора UNPIVOT към този резултат и ще видим дали можем да се върнем към оригиналната таблица. За да направите това, изпълнете следния скрипт:
Забележка:
Можем да изпълним тази заявка в училищната база данни, която създадохме в секцията за оператори PIVOT.
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
Тук използваме подзаявка, за да приложим оператора UNPIVOT към завъртяните данни. Вътрешната заявка използва оператора PIVOT, докато външната заявка използва оператора UNPIVOT. На изхода ще видите оригиналната таблица на Students.
Обръщане на обобщена завъртяна таблица
По-рано казахме, че е възможно само да се обърне PIVOT оператор, който не съдържа агрегирани данни. Нека се опитаме да обърнем оператора PIVOT, който съдържа обобщени данни.
Добавете още един запис към таблицата на учениците на училищната база данни, която създадохме в първия раздел на тази статия. За да направите това, изпълнете следната заявка:
INSERT INTO Students VALUES ('Edward', 'History', 78)
Сега, ако изберете всички записи от таблицата Студенти, ще получите следния изход:
Можем да видим, че имаме дублиран запис за резултата на Едуард в историята.
Сега приложете оператора PIVOT към тази таблица.
SELECT Id, StudentName, English, History FROM Students PIVOT ( SUM (Score) FOR Course in (English, History) ) AS Schoolpivot
От изхода можете да видите, че функцията SUM в оператора PIVOT е добавила два резултата към курса по история, взет от Едуард. Ако се опитате да обърнете опорната точка на тази таблица (т.е. да приложите оператора UNPIVOT), няма да получите оригиналната таблица. Той ще върне четирите записа вместо оригиналните пет. Колоната История за ученика Едуард ще съдържа обобщения резултат, а не отделните резултати.
За да видите това, изпълнете следния скрипт:
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
Изходната таблица ще изглежда така:
Препратки:
- Microsoft:Използване на PIVOT и UNPIVOT
- Codingsight:Използване на PIVOT в SQL
- YouTube:Обратно ПОВОТ видео