You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:52:32