SQL Server clasifica el diario de aprendizaje de conversión

Referencia de https://www.cnblogs.com/wanghonghu/p/5631662.html

Uno, fila a columna

Crear fila para listar e insertar datos

CREATE TABLE RowConvertToColumn(
    USERNAME VARCHAR(40)  NULL,
	COURSE VARCHAR(40)  NULL,
	SCORE NUMERIC(10,2)  NULL
) 

INSERT INTO RowConvertToColumn VALUES('张三','语文',84);
INSERT INTO RowConvertToColumn VALUES('张三','数学',94);
INSERT INTO RowConvertToColumn VALUES('张三','外语',76);
INSERT INTO RowConvertToColumn VALUES('李四','语文',88);
INSERT INTO RowConvertToColumn VALUES('李四','数学',95);
INSERT INTO RowConvertToColumn VALUES('李四','外语',80);
INSERT INTO RowConvertToColumn VALUES('王五','语文',98);
INSERT INTO RowConvertToColumn VALUES('王五','数学',96);
INSERT INTO RowConvertToColumn VALUES('王五','外语',70);
INSERT INTO RowConvertToColumn(USERNAME) VALUES('赵六');

Consultar los datos nuevamente

Inserte la descripción de la imagen aquí
1. Cómo escribir caso ... cuando ...

SELECT USERNAME 姓名 ,		
		MAX(CASE COURSE WHEN '语文' THEN SCORE ELSE 0 END ) AS 语文,
		MAX (CASE COURSE WHEN '数学' THEN SCORE ELSE 0 END ) AS 数学,
		MAX(CASE COURSE WHEN '外语' THEN  SCORE ELSE 0 END  ) AS 外语
FROM RowConvertToColumn GROUP BY USERNAME ORDER BY USERNAME ;
效果:

Inserte la descripción de la imagen aquí

2. La función PIVOT realiza rápidamente la conversión de filas

 PIVOT函数的格式如下:  
 PIVOT(<聚合函数>([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转列后的列名N]))
实际操作:
SELECT USERNAME 姓名 , 语文, 数学,外语 FROM RowConvertToColumn PIVOT(MAX(SCORE) FOR COURSE IN (语文,数学,外语 ))AS T
效果:

Inserte la descripción de la imagen aquí

3. Realice la conversión de filas de forma dinámica

declare @sql nvarchar(2000)
select @sql=ISNULL(@sql+',','')+course
from RowConvertToColumn
group by course
set @sql='select * from RowConvertToColumn pivot (max(score) for course in ('+@sql+')) a'
exec(@sql)
效果:

Inserte la descripción de la imagen aquí

Fila de conversión de dos columnas

Crear tabla de columna a fila e insertar datos

CREATE TABLE ColumnConvertToRow(
	[姓名] VARCHAR(40) NULL,
	[语文] NUMERIC(10,2)  NULL,
	[数学] NUMERIC(10,2)  NULL,
	[外语] NUMERIC(10,2)  NULL
) 

INSERT INTO ColumnConvertToRow VALUES('张三',85,78,64);
INSERT INTO ColumnConvertToRow VALUES('李四',89,54,78);
INSERT INTO ColumnConvertToRow VALUES('王五',64,78,97);
原始数据:

Inserte la descripción de la imagen aquí

1, columna sql estática a fila, utilizada cuando hay menos encabezados de columna

SELECT * FROM 
(
   SELECT 姓名,课程='语文',分数=语文 FROM ColumnConvertToRow
   UNION ALL
   SELECT 姓名,课程='数学',分数=数学 FROM ColumnConvertToRow
   UNION ALL 
   SELECT 姓名,课程='外语',分数=外语 FROM ColumnConvertToRow
) T ORDER BY 姓名
效果:

Inserte la descripción de la imagen aquí

2. Use la función UNPIVOT, la declaración debe ser sqlserver2005 y superior para usar

UNPIVOT函数的格式如下:
UNPIVOT([转换为行的列值在转换后对应的列名] for [转换为行的列名在转换后对应的列名] in ([转换为行的列1],[转换为行的列2],[转换为行的列3],...[转换为行的列N]))
实际操作:
SELECT 姓名,科目, 分数 FROM ColumnConvertToRow UNPIVOT(分数 FOR 科目 IN(语文,数学,外语)) AS T ORDER BY 姓名;
效果:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/luan0125/article/details/109309732
Recomendado
Clasificación