MySQL -- 行转列的两种方法

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

两张表:

左表:product ,右表:cate

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;

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

当然也可以进行连表查询使用,如下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

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

需要说明的地方:

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

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

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值