Database
 sql >> база данни >  >> RDS >> Database

Разбиране на Pivot оператора в SQL

Операторът на въртене в SQL Server преобразува всеки ред от обобщения набор от резултати в съответните колони в изходния набор. Операторът за въртене е особено полезен при писане на запитвания за кръстосани таблици.

Нека да разгледаме как работи на практика.

Подготовка на данните

Първо, нека създадем някои фиктивни данни, които след това можем да използваме, за да внедрим оператора на въртене.

CREATE DATABASE schooldb
					
CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    DOB datetime NOT NULL,
    total_score INT NOT NULL,
    city VARCHAR(50) NOT NULL
 )

INSERT INTO student

VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'), 
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'), 
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'), 
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'), 
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'), 
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'), 
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'), 
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'), 
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'), 
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');

Как работи операторът Pivot?

Стандартният начин за групиране на SQL данни е чрез използване на клаузата Group By. Нека създадем заявка, която изчислява средната стойност на стойностите в колоната total_score на таблицата на учениците, групирана по град.

USE schooldb

SELECT 
	city,
	AVG(total_score) as Avg_Score
FROM 
	student
GROUP BY
	city

Това дава следния резултат:

[table id=25 /]

Ами ако искаме набор от резултати, където имената на градовете се показват в колони, където всяка колона съдържа средната стойност на total_score на учениците, принадлежащи към този град? Нещо като това:

[table id=26 /]

Тук е полезен операторът на въртене.

Избор на основни данни

Първата стъпка при използване на оператора на въртене е да изберете базовите данни, на които ще се базира операторът на въртене. Искаме да групираме нашите данни по град и да намерим средната стойност на total_score на учениците, които принадлежат към този град. Следователно, трябва да напишем прост оператор SELECT, който избира града и total_score.

SELECT 
	city,
	total_score
FROM 
	student

Създаване на временен набор от данни

Сега, в идеалния случай, бихме могли директно да приложим въртящия оператор върху базовите данни, които създадохме в предишния раздел, но за съжаление не можем. За да работи въртящият се оператор, трябва да създадем израз със стойност на таблица, към който можем да приложим оператора за въртене. Тук имаме разнообразни възможности за избор; бихме могли да използваме производни таблици, общи изрази за таблици (CTEs) или дори бихме могли да създадем временни таблици.

За този пример ще използваме бърза, проста извлечена таблица. За да направим това с основния оператор за избор, който създадохме в последния раздел, го увиваме в набор от скоби и след това прилагаме псевдоним към него. Накрая избираме всичко от тази производна таблица.

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable

Прилагане на оператора Pivot

След като подготвихме нашите основни данни и създадохме извлечена таблица, ще приложим оператора на въртене към нея.

За да направите това, поставете „PIVOT“ в края на извлечената таблица, последвано от набор от скоби и дайте псевдоним на тази обобщена таблица.

В скоби трябва да посочим важна информация.

  1. Трябва да посочим полето, към което искаме да приложим агрегатна функция. В нашия случай искаме да приложим агрегатната функция AVG в колоната „total_score“.
  2. След това трябва да кажем към кои колони от основните данни обръщаме данните си. Правим това, като изписваме „ЗА“, последвано от името на колоната, което е град в нашия пример.
  3. Последната стъпка е малко дразнеща. Трябва да изброим стойностите от колоната град, които искаме да станат заглавия в нашата централна таблица. Използваме оператора IN, последван от набор от скоби. В скобите използваме списък, разделен със запетая, където пишем името на всяка колона в квадратна скоба. В нашия пример искаме Лондон, Лийдс и Манчестър като имена на заглавия на централната таблица и затова ги записваме в този формат:([Лондон], [Лийдс], [Манчестър]).
USE schooldb

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

Ако изпълните горната заявка, резултатите ще изглеждат така:

[table id=27 /]

Добавяне на групи от редове в обобщена таблица

В предишните раздели видяхме как да преобразуваме групи от редове в групи от колони с помощта на въртящ оператор. Можете обаче също да добавите групи от редове заедно с групи колони в обобщена таблица.

Например, ако искате да намерите средната стойност на колоната total_score на всички ученици, групирани по града, както и по пол, можете да използвате групата колони и групата от редове във връзка в централна таблица. Тук всяка колона ще представлява име на град и всеки ред ще представлява пол на ученик.

За щастие не е нужно да пишете допълнителен скрипт, за да добавите групи от редове към обобщена таблица. В основния набор от данни просто добавете името на колоната, която искате да добавите като група от редове към централната таблица.

USE schooldb

SELECT * FROM

(SELECT 
	city,
	gender,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

В горния скрипт просто добавихме колона „пол“ в основния оператор SELECT.

Резултатът от горната заявка изглежда така:

[table id=28 /]

Това е кръстосана таблица. Например, от резултатите може да се види, че средният total_score на жените студенти, живеещи в Лондон, е 500. По същия начин, средният общ резултат на студентите мъже, живеещи в Лондон, е 571.

Прочетете също:

Създаване на динамична обобщена таблица с функция QUOTENAME


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Повече за въвеждането на часови зони в дълготраен проект

  2. Правилата на Код в SQL

  3. ОГРАНИЧЕНИЕ НА ВЪНШИЯ КЛЮЧ SQL:Най-доброто, лесно ръководство за начинаещи

  4. Разширен SQL:КРЪСТО ПРИЛАГАНЕ и ВЪНШНО ПРИЛАГАНЕ

  5. SQL EXISTS оператор за начинаещи