列转行的两种方法 -- MySQL

 2018-12-25 19:38:17   {{zan}}   217 

MySQL中列传行是很常用的,本文给出了两种列转行的方法

两张表:

SQL语句:

第一种方法:IF()语句

SELECT cid,
MAX(IF(mon ='一月份',num,0)) '一月份',
MAX(IF(mon ='二月份',num,0)) '二月份'
FROM product GROUP BY cid;

第二种方法:CASE WHEN THEN ELSE NED

SELECT cid,
MAX(CASE mon WHEN '一月份' THEN num ELSE 0 END) as '一月份',
MAX(CASE mon WHEN '二月份' THEN num ELSE 0 END) as '二月份'
FROM product GROUP BY cid;

两者得到的结果一样,如下:

当然也可以连表查询:

方法一:
SELECT c.pname ,
MAX(IF(mon ='一月份',num,0)) '一月份',
MAX(IF(mon ='二月份',num,0)) '二月份'
FROM cate c LEFT JOIN product p ON c.id = p.cid GROUP BY c.id;
方法二:
SELECT c.pname ,
MAX(CASE mon WHEN '一月份' THEN num ELSE 0 END) as '一月份',
MAX(CASE mon WHEN '二月份' THEN num ELSE 0 END) as '二月份'
FROM cate c LEFT JOIN product p ON c.id = p.cid GROUP BY c.id

两者得到的结果也是一样的:



需要说明的地方:

        方法二中的MAX()是为了能够使用GROUP BY根据cid进行分组,因为每一个cd对应的 mon ='一月份' 的记录只有一条,所以MAX()的值就等于对应那一条记录的num的值。

        假如cid='1' 和 mon ='一月份' 的记录有两条,则此时MAX() 的值将会是这两条记录中的最大的值,同理,使用SUM()就是求两者的和。因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。


欢迎指导!


千而の大狮子!




提交 清空