话不多说直接进入正题
数据接库数据如下图:
要把数据变成行,一目了然的看到一个学生的所有科目成绩,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!!!