MySQL -- 行转列的两种方法

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

两张表:

左表:product ,右表:cate

MySQL -- 行转列的两种方法_第1张图片MySQL -- 行转列的两种方法_第2张图片

SQL语句:

第一种方法:IF()语句

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

第二种方法:CASE  WHEN THEN  ELSE  END

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;

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

MySQL -- 行转列的两种方法_第3张图片

当然也可以进行连表查询使用,如下SQL:

方法一:
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

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

MySQL -- 行转列的两种方法_第4张图片

需要说明的地方:

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

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

更多请看:https://www.caohongyuan.cn/article/74

 

你可能感兴趣的:(MYSQL)