Hike News
Hike News

磨刀霍霍:关于行转列那些事儿

关于行列转换

关于行转列

  • 常见的基础例子

--创建学生成绩表T_StudentScore
create table T_StudentScore(PK_ID int ,Name varchar(10) , Course varchar(10) , Score int)
--更改PK_ID 的列属性,选择”是标识“,标识增量为1,也就是PK_ID 字段的数据是自增长的
--向学生成绩表添加几条成绩信息
insert into T_StudentScore values('木子' , '语文' , 74)
insert into T_StudentScore values('木子' , '数学' , 83)
insert into T_StudentScore values('木子' , '物理' , 93)
insert into T_StudentScore values('山石' , '语文' , 74)
insert into T_StudentScore values('山石' , '数学' , 84)
insert into T_StudentScore values('山石' , '物理' , 94)

需要考虑是否为动态变化的情况

方法 1 : 静态行转列

SELECT distinct Name,
SUM(CASE Course WHEN '语文' Score ELSE 0 END) 语文,
SUM(CASE Course WHEN '语文' Score ELSE 0 END) 数学,
SUM(CASE Course WHEN '语文' Score ELSE 0 END) 物理
FROM T_StudentScore
GROUP BY Name

distinct 不能省略

方法 2 : povit 函数

  1. 需要确认使用的表
  2. 需要确认那一列的值作为新的列
  3. 确认新的列要取的值
SELECT * FROM T_StudentScore 
POVIT(
SUM(Score)
FOR Course IN ('语文','数学','物理')
) AS Course_c

关于列转行

  • 常见的基础例子
CREATE TABLE ProgrectDetail
(
ProgrectName NVARCHAR(20), --工程名称
OverseaSupply INT, --海外供应商供给数量
NativeSupply INT, --国内供应商供给数量
SouthSupply INT, --南方供应商供给数量
NorthSupply INT --北方供应商供给数量
)

INSERT INTO ProgrectDetail
SELECT 'A', 100, 200, 50, 50
UNION ALL
SELECT 'B', 200, 300, 150, 150
UNION ALL
SELECT 'C', 159, 400, 20, 320
UNION ALL
SELECT 'D', 250, 30, 15, 15

方法 1 : union 函数

SELECT ProgrectName, 'OverseaSupply' AS Supplier,
MAX(OverseaSupply) AS 'SupplyNum'
FROM ProgrectDetail
GROUP BY ProgrectName
UNION ALL
SELECT ProgrectName, 'NativeSupply' AS Supplier,
MAX(NativeSupply) AS 'SupplyNum'
FROM ProgrectDetail
GROUP BY ProgrectName
UNION ALL
SELECT ProgrectName, 'SouthSupply' AS Supplier,
MAX(SouthSupply) AS 'SupplyNum'
FROM ProgrectDetail
GROUP BY ProgrectName
UNION ALL
SELECT ProgrectName, 'NorthSupply' AS Supplier,
MAX(NorthSupply) AS 'SupplyNum'
FROM ProgrectDetail
GROUP BY ProgrectName