数据库行转列

话不多说直接进入正题

数据接库数据如下图:

 要把数据变成行,一目了然的看到一个学生的所有科目成绩,SQL如下:

SELECT Name, 
MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文',
MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学',
MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语',
MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'
FROM StudentScores
GROUP BY Name

执行结果如下:

这里解释一下SQL,查询的时候用case when then选择需要进行转行的字段以及字段结果,即当Subject是xx的时候选择Subject对应的Score作为Subject的成绩,这里需要注意case when then的结果要用max函数包裹,不然结果也会变成行,但是每行只有一科的成绩,用max包裹就是选择最大成绩,把多行合并成一行完成行转列。

再举个栗子吧

数据库数据如下:

要求按日期、支付方式来统计充值金额信息,SQL如下:

SELECT Time, 
CASE Type WHEN '支付宝'  THEN SUM(Money) ELSE 0 END AS '支付宝', 
CASE Type WHEN '微信'    THEN SUM(Money) ELSE 0 END AS '微信', 
CASE Type WHEN '云闪付'  THEN SUM(Money) ELSE 0 END AS '云闪付', 
CASE Type WHEN '信用卡'  THEN SUM(Money) ELSE 0 END AS '信用卡' 
FROM game 
GROUP BY Time, Type

SQL的执行结果如下:

 这个结果也只是统计出了不同时间,不同类型的充值,虽然行转列了,但是每行只有一个字段有数据,如果需要做统计还需要再进行处理,处理SQL如下:

SELECT Time, 
SUM(支付宝) AS 支付宝,
SUM(微信) AS 微信,
SUM(云闪付) AS 云闪付,
SUM(信用卡) AS 信用卡
FROM 
(SELECT Time, 
CASE Type WHEN '支付宝'  THEN SUM(Money) ELSE 0 END AS '支付宝', 
CASE Type WHEN '微信'    THEN SUM(Money) ELSE 0 END AS '微信', 
CASE Type WHEN '云闪付'  THEN SUM(Money) ELSE 0 END AS '云闪付', 
CASE Type WHEN '信用卡'  THEN SUM(Money) ELSE 0 END AS '信用卡' 
FROM game GROUP BY Time, Type) a
GROUP BY Time

 同过对第一次SQL的再一次求和,完成了去除0值,结果如下:

 OK!!!

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值