【问题标题】:How to merge two different field values into one row?如何将两个不同的字段值合并到一行中?
【发布时间】:2013-12-24 00:18:21
【问题描述】:

我需要通过将两个相似但略有不同的维度字段值合并到一个新行中来清理一些数据,该行将两个指标值相加,保持 uid 和日期不变。

当前设置如下所示:

 ╔═════╦═════════════╦══════╦═══════════╦═══════════╗
 ║ id  ║ date        ║ uid  ║ source    ║ pageviews ║
 ╠═════╬═════════════╬══════╬═══════════╬═══════════╣
 ║  1  ║ 2013-12-11  ║ 111  ║ source1   ║   14      ║
 ║  3  ║ 2013-12-11  ║ 111  ║ source1a  ║   1       ║
 ║  11 ║ 2013-12-11  ║ 222  ║ source1   ║   3       ║
 ║  19 ║ 2013-12-11  ║ 222  ║ source1a  ║   11      ║
 ╚═════╩═════════════╩══════╩═══════════╩═══════════╝

我想考虑 source1 和 source1a 相等并将两者合并,得到这个:

 ╔═════╦═════════════╦══════╦══════════╦═══════════╗
 ║ id  ║ date        ║ uid  ║ source   ║ pageviews ║
 ╠═════╬═════════════╬══════╬══════════╬═══════════╣
 ║  1  ║ 2013-12-11  ║ 111  ║ source1  ║   15      ║
 ║  2  ║ 2013-12-11  ║ 222  ║ source1  ║   14      ║
 ╚═════╩═════════════╩══════╩══════════╩═══════════╝

id 不重要,我本来打算重新增加新表中的 id 结果

这是我尝试过的,但它没有合并两条记录——我得到匹配的值但仍然是单独的行:

SELECT date, uid, (SELECT CASE
WHEN source = 'source1a' THEN 'source1'
ELSE source
END) AS 'source', pageviews
FROM trafficSourceMedium
GROUP BY date, source, userid

【问题讨论】:

  • 你也需要 group by 的case语句
  • “1”和“2”从何而来?

标签: mysql sql merge


【解决方案1】:

聚合查询应该做你想做的事:

select `date`, uid,
       (case when source = 'source1a' then 'source1' else source end) as source,
       sum(pageviews) as pageviews
from trafficSourceMedium
group by `date`, uid,
          (case when source = 'source1a' then 'source1' else source end);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多