数据库行转列

话不多说直接进入正题

数据接库数据如下图:

 要把数据变成行,一目了然的看到一个学生的所有科目成绩,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!!!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页