Computer >> 컴퓨터 >  >> 프로그램 작성 >> SQL Server

SQL Server의 PIVOT 절

SQL Server(Transact-SQL)에서 PIVOT 절을 사용하면 교차 도표에서 한 테이블에서 다른 테이블로 데이터를 전송할 수 있습니다. 즉, 집계 결과를 얻고 행에서 열로 이동할 수 있습니다.

SQL Server의 PIVOT 절
이 예에서는 합계를 계산한 다음 데이터 테이블의 열에 행을 전달합니다.

PIVOT 절 구문

  SELECT cot_ dautien AS , 
[giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]
FROM
() AS
PIVOT
(
ham_tong ()
FOR
IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n])
) AS n>; ) AS n>;

변수 이름 또는 변수 값

cot_dautien

전환 후 열 또는 표현식이 새 테이블의 첫 번째 열이 됩니다.

bidanh_cot_dautien

전송 후 새 테이블의 첫 번째 열 이름입니다.

giatri_chuyen1, giatri_chuyen2, . giatri_chuyen_n

전송할 값 목록.

bang_nguon

SELECT 문은 소스 데이터(초기 데이터)를 새 테이블로 가져옵니다.

bidanh_bang_nguon

bang_nguon의 별칭

ham_tong

SUM, COUNT, MIN, MAX 또는 AVG와 같은 합계 함수

cot_tong

열 또는 표현식이 ham_tong과 함께 사용됩니다.

cot_chuyen

열에는 전송할 값이 포함됩니다.

bidanh_bang_chuyen

전송 후 테이블의 별칭입니다.

PIVOT 절은 이후 버전의 SQL Server(SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008 및 SQL Server 2005)에서 사용할 수 있습니다.

튜토리얼의 단계를 따르려면 이 문서의 끝에 있는 테이블 생성을 위한 DDL 섹션과 데이터 생성을 위한 DML을 참조한 다음 자신의 데이터베이스에서 실행해 보십시오.

PIVOT 절의 예

아래와 같은 데이터가 있는 테이블이 있습니다.

so_nhan_en_production 아이디퐁 12009 Nguyen Huong 54000 45 34974 Pham Hoa 80000 45 34987 Phan Lan 42000 45 45001 Tran Hua 57500 30 75623 Vu Hong 650000-30 PIVOT 절.

  SELECT 'TongLuo ng' AS TongLuongTheoPhong, 
[30], [45]
FROM
(SELECT id_phong, luong
FROM nhanvien) AS BangNguon
PIVOT
(
SUM(luong)
FOR id_phong IN ([30], [45])
) AS BangChuyen;

반환된 결과는 다음과 같습니다.

통룽테오퐁 30 45 TongLuong 122500 176000

위의 예는 데이터가 전송된 후 테이블을 생성하여 방의 총 급여가 ID 30이고 방 ID가 45임을 나타냅니다. 결과는 2개의 열이 있는 행에 있으며 각 열은 1개의 방입니다.

교차 쿼리의 새 테이블에서 열 지정

먼저 전송 테이블에 포함할 정보 필드를 결정해야 합니다. 이 예에서 TongLuong은 첫 번째 열이고 다음 2개의 열 id_pong 30 및 id_pong 45입니다.

  SEL ECT 'TongLuong' AS TongLuongTheoPhong, 
[30], [ 45]

소스 테이블의 데이터 결정

다음은 새 테이블의 소스 데이터를 반환할 SELECT 문입니다.

이 예에서는 테이블에서 id_pong입니다.

  (SELECT id_phong, lu ong 
FROM nhanvien) AS Ba ngNguon

소스 쿼리의 별칭을 지정해야 합니다. 이 예에서는 BangNguon입니다.

전체 계산 함수 결정

교차 쿼리에 사용할 수 있는 함수에는 SUM, COUNT, MIN, MAX 및 AVG가 있습니다. 이 예에서 합계 함수 SUM.

 PIVOT 
(SUM(luong)

전송할 값 결정

마지막으로 결과를 포함하려면 값을 전송해야 합니다. 이것은 교차 쿼리의 열 헤더가 됩니다.

이 예에서는 id_folder 30과 45만 반환하면 됩니다. 이 값은 새 테이블의 열 이름이 됩니다. 이 값은 id_phong의 제한된 값 목록이며 모든 값을 포함할 필요는 없습니다.

 FOR id_phong IN ([30], [45]) 

DDL / DML 예시

데이터베이스가 있고 위의 PIVOT 사용 설명서에 있는 예제를 시도하려면 DDL/DML이 필요합니다.

DDL - 데이터 정의 언어 PIVOT 절 예제에서 사용하기 위한 테이블 생성 명령(CREATE TABLE)입니다.

  CREATE TA BLE phong 
( id_phong INT NOT NULL,
ten_phong VARCHAR(50) NOT NULL,
CONSTRAINT pk_phong PRIMARY KEY (id_phong)
) ;
  CREATE T ABLE nhanvien 
( so_nhanvien INT NOT NULL,
ho VARCHAR(50) NOT NULL,
ten VARCHAR(50) NOT NULL,
luong INT,
id_phong INT,
CONSTRAINT pk_nhanvien PRIMARY KEY (so_nhanvien)
) ;

DML - 데이터 조작 언어 테이블에 필요한 데이터를 생성하기 위한 INSERT 문입니다.

  INSERT INTO phong 
(id_phong, ten_phong)
VALUES
(30, 'Ketoan ');
  INSERT INTO  phong 
(id_phong, ten_phong)
VALUES
(45, 'Banhang');
  INSERT INTO nhanvien 
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(12009, 'Nguye n', 'Huong', 54000, 45);
  INSERT INTO  nhanvien 
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34974, 'Pham', 'Flowers', 80000, 45);
  INSERT INTO anvien 
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34987, 'Phan', 'La n', 42000, 45);
  INSERT  INTO nhanvien 
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
45001, 'Tr an', 'Hue', 57500, 30);
  INSERT INTO home 
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(75623, 'Vu', 'Hong' , 65000, 30);