MySQL 5.1实现按日期聚合并拆分不同domainid的shares为列
解决MySQL行转列(Pivot)实现需求
嘿,我明白你想要把原来按行存储的不同domainid的shares数据,转换成按日期分组、每个domainid作为单独列的格式。你之前用GROUP_CONCAT的问题在于它会把多个shares合并到同一列里,而不是拆分成独立的列——这就需要用条件聚合的方式来实现啦,刚好MySQL 5.1完全支持这种写法。
方法1:使用CASE WHEN语句
这是最通用的方式,逻辑清晰,适合任何支持SQL的数据库:
SELECT day, MAX(CASE WHEN domainid = 1 THEN shares ELSE NULL END) AS `domainid1-shares`, MAX(CASE WHEN domainid = 3 THEN shares ELSE NULL END) AS `domainid3-shares` FROM tblFacebook GROUP BY day ORDER BY day;
方法2:使用IF函数(MySQL专属更简洁写法)
MySQL提供了IF函数,可以让代码更紧凑,效果和上面的CASE WHEN完全一致:
SELECT day, MAX(IF(domainid = 1, shares, NULL)) AS `domainid1-shares`, MAX(IF(domainid = 3, shares, NULL)) AS `domainid3-shares` FROM tblFacebook GROUP BY day ORDER BY day;
为什么这样写能生效?
- 对于每一行数据,
CASE WHEN/IF会判断当前行的domainid是否匹配目标值,匹配就返回对应的shares,否则返回NULL。 - 用
MAX()(或者MIN()/SUM()都可以,因为每个day+domainid组合只有一条数据)聚合后,每个日期下每个domainid只会保留有效的shares值,没有数据的就显示NULL(对应你期望输出里的空单元格)。 - 最后按
day分组排序,就能得到你想要的结果啦。
如果以后需要新增其他domainid的列,只需要复制一行对应的CASE WHEN/IF语句,修改domainid的值和列名就行。
内容的提问来源于stack exchange,提问作者Thomas Mathiesen
相关产品推荐
相关产品推荐

