数据库表行列转置的实现_Mysql

 问题描述:
表中数据:
 数据库表行列转置的实现_Mysql_第1张图片
 写出查询语句,使最后的输出为
图片 
正确的SQL语句为:
SELECT NAME,MAX(CASE SUBJECT WHEN '语文' THEN grade END) AS '语文',
MAX(CASE SUBJECT WHEN '数学' THEN grade END) AS '数学' ,
MAX(CASE SUBJECT WHEN '英语' THEN grade END) AS '英语' FROM aa GROUP BY NAME; 
也可以将MAX改为min,甚至SUM都是可行的,难得之间存在着什么特殊的关系吗?
        
        后来发现去掉第一case中的MAX并不影响结果,但是去掉第二个结果就变了,这是为什么?
SQL语句:
SELECT NAME,(CASE SUBJECT WHEN '语文' THEN grade END) AS '语文',
(CASE SUBJECT WHEN '数学' THEN grade END) AS '数学' ,
sum(CASE SUBJECT WHEN '英语' THEN grade END) AS '英语' FROM aa GROUP BY NAME; 
结果:
图片
 
再搞清楚这个问题前,我们先看一下case的用法,先化整体为单一开始分析
1、SELECT NAME,(CASE SUBJECT WHEN '语文' THEN grade END) AS '语文' FROM aa ; 
数据库表行列转置的实现_Mysql_第2张图片
2、SELECT NAME,(CASE SUBJECT WHEN '数学' THEN grade END) AS '数学' FROM aa ; 
数据库表行列转置的实现_Mysql_第3张图片

3、SELECT NAME,(CASE SUBJECT WHEN '英语' THEN grade END) AS '英语' FROM aa ; 
数据库表行列转置的实现_Mysql_第4张图片

通过对比可以发现,恰恰是第一个case( 不加函数的 )第一条存在数据,所以导致case then的结果正确,而其他的case第一条数据都为空。查阅资料我们可以知道case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。所以正是因为这个原因导致结果不同。建议上面所有case加上MAX()函数,因为通过MAX() 函数可以过滤到匹配到空值的情况

你可能感兴趣的:(数据库)