问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/weixin_38653290/article/details/85488532

以前有写过行转列,列转行的博客 具体见:
https://blog.csdn.net/weixin_38653290/article/details/84639754
今天分享下使用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;
  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号