使用case when,union all实现sql行转列、列转行

转自:https://blog.csdn.net/weixin_38653290/article/details/85488532

今天分享下使用case when,union all实现sql行转列、列转行

-- 建表 
CREATE TABLE StudentScores ( 
UserName NVARCHAR(20), -- 学生姓名 
Subject NVARCHAR(30), -- 科目 
Score FLOAT -- 成绩 ) 

 

-- 添加数据 
INSERT INTO StudentScores SELECT '张三', '语文', 80 ; 
INSERT INTO StudentScores SELECT '张三', '数学', 90 ; 
INSERT INTO StudentScores SELECT '张三', '英语', 70 ; 
INSERT INTO StudentScores SELECT '张三', '生物', 85 ; 
INSERT INTO StudentScores SELECT '李四', '语文', 80 ; 
INSERT INTO StudentScores SELECT '李四', '数学', 92 ; 
INSERT INTO StudentScores SELECT '李四', '英语', 76 ; 
INSERT INTO StudentScores SELECT '李四', '生物', 88 ; 
INSERT INTO StudentScores SELECT '码农', '语文', 60 ; 
INSERT INTO StudentScores SELECT '码农', '数学', 82 ; 
INSERT INTO StudentScores SELECT '码农', '英语', 96 ; 
INSERT INTO StudentScores SELECT '码农', '生物', 78 ;
-- 使用PIVOT行转列 
SELECT * FROM StudentScores 
AS P PIVOT ( SUM(Score) FOR p.Subject IN ('语文','数学','英语','生物') ) AS T 

-- 使用case when行转列 
select UserName, 
max(case when subject='语文' then score else 0 end) 语文, 
max(case when subject='数学' then score else 0 end) 数学,
 max(case when subject='英语' then score else 0 end) 英语, 
max(case when subject='生物' then score else 0 end) 生物 
from StudentScores group by UserName

-- 建表 drop table if exists StudentScores2; 
CREATE TABLE StudentScores2 ( 
UserName NVARCHAR(20), -- 学生姓名 
语文 FLOAT, -- 科目 
数学 FLOAT, -- 科目 
英语 FLOAT, -- 科目 
生物 FLOAT -- 科目 ); 

-- 添加数据 
insert into StudentScores2 select UserName, 
max(case when subject='语文' then score else 0 end) 语文, 
max(case when subject='数学' then score else 0 end) 数学, 
max(case when subject='英语' then score else 0 end) 英语, 
max(case when subject='生物' then score else 0 end) 生物 
from StudentScores group by UserName;

 

 

-- 使用union all 列转行

select UserName,'语文' subject,语文 score from StudentScores2 union all 
select UserName,'数学' subject,数学 score from StudentScores2 union all 
select UserName,'英语' subject,英语 score from StudentScores2 union all 
select UserName,'生物' subject,生物 score from StudentScores2;

根据提供的引用内容,case when是一种MySQL中的条件语句,用于根据条件返回不同的结果。而列转行是一种数据转换的方式,将原本在列中的数据转换为行中的数据。在MySQL中,可以使用case when语句实现列转行的功能。具体实现方法可以参考以下步骤: 1. 使用UNION ALL将多个SELECT语句的结果合并为一个结果集。 2. 在每个SELECT语句中使用case when语句,将需要转换的列作为条件,将对应的值作为结果。 3. 在每个SELECT语句中添加一个标识列,用于区分不同的行。 4. 在最外层的SELECT语句中使用GROUP BY语句,将结果按照标识列进行分组。 这样就可以将原本在列中的数据转换为行中的数据了。例如,假设有一个表格包含学生姓名和成绩,需要将成绩转换为行中的数据,可以使用以下SQL语句: ``` SELECT '语文' AS subject, MAX(CASE WHEN name = '张三' THEN score ELSE NULL END) AS '张三', MAX(CASE WHEN name = '李四' THEN score ELSE NULL END) AS '李四', MAX(CASE WHEN name = '王五' THEN score ELSE NULL END) AS '王五' FROM scores UNION ALL SELECT '数学' AS subject, MAX(CASE WHEN name = '张三' THEN score ELSE NULL END) AS '张三', MAX(CASE WHEN name = '李四' THEN score ELSE NULL END) AS '李四', MAX(CASE WHEN name = '王五' THEN score ELSE NULL END) AS '王五' FROM scores UNION ALL SELECT '英语' AS subject, MAX(CASE WHEN name = '张三' THEN score ELSE NULL END) AS '张三', MAX(CASE WHEN name = '李四' THEN score ELSE NULL END) AS '李四', MAX(CASE WHEN name = '王五' THEN score ELSE NULL END) AS '王五' FROM scores GROUP BY subject; ``` 这个SQL语句将成绩表格中的数据按照学科和学生进行了转换,将每个学生在不同学科下的成绩转换为了行中的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值