如何对特定列中具有相同值的行求和

Posted

技术标签:

【中文标题】如何对特定列中具有相同值的行求和【英文标题】:How to sum rows that have the same value in a specific column 【发布时间】:2017-06-16 16:49:12 【问题描述】:

我正在尝试获得显示展示位置产生的收入的结果。要计算展示位置收入,我需要进行此计算(campaign_cpc(欧元)*展示位置产生的点击次数)。一个展示位置可以通过不同的campaign_cpc 产生点击。

现在我得到的结果是这样的:

+------------------+---------------------+
| placement_name   | placement_revenue_€ |
+------------------+---------------------+
| placement_name_1 | 147,2               |
+------------------+---------------------+
| placement_name_1 | 170,95              |
+------------------+---------------------+
| placement_name_2 | 14,4                |
+------------------+---------------------+
| placement_name_2 | 51,35               |
+------------------+---------------------+

这是因为每个展示位置(展示位置 1 和 2)都产生了具有两个不同campaign_cpc 的点击次数。

但我实际上需要按位置聚合的结果:

+------------------+---------------------+
| placement_name   | placement_revenue_€ |
+------------------+---------------------+
| placement_name_1 | 318,15              |
+------------------+---------------------+
| placement_name_2 | 65,75               |
+------------------+---------------------+

我正在使用的查询是这个:

SELECT
      placement_name,
      campaign_cpc*clicks as placement_revenue_€

FROM (

      SELECT
            p.name as placement_name,
            cc.cpc as campaign_cpc,
            COUNT(CASE WHEN re.event_type = 'click' 
            AND content_card_id IS NOT NULL THEN event_type END) as clicks

      FROM  raw_events re
      JOIN  app_data.placements p ON p.id=re.placement_id
      JOIN  app_data.content_cards cc ON cc.id=re.content_card_id

      GROUP BY 
          cc.cpc,
          p.name
      )

GROUP BY
      placement_name,
      clicks

ORDER BY 
      placement_name

如何修改上述查询以获得聚合结果?

我在 i686-pc-linux-gnu 上使用 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.1337 编译

非常感谢!

【问题讨论】:

当前您按click 分组,但没有此名称的字段(有一个字段clicks)。此外,click 之后的逗号将使其不是 SQL。所以这个问题有些不准确。基本上,@JoshKopen 有正确的修复,但问题可能不同。只需从实际输出中使用复制粘贴 - 它更快。 @DanGetz 谢谢你的回答。我刚刚纠正了点击的事情。这是因为我在发布之前手动压缩了查询,这样更容易阅读(原始查询中有很多类型的点击事件)。我仍然看到相同的结果。还有其他想法吗?再次感谢大家! 就像@JoshKopen 所说,从第二个(外部)GROUP BY 中删除clicks,并在campaign_cpc*clicks 周围添加一个SUM(),它应该这样做。但也许您正在简化答案并添加一些内容。 你们说的其实是对的。只需将您的评论正确地转移到原始查询中。非常感谢你们,祝两位周末愉快! :-) 【参考方案1】:

修正你的陈述以获得你想要的结果的方法是不要按点击分组。仅按placement_name 分组。这将不再区分具有不同点击的行,因此您的求和将正常工作。还要在您的选择语句中加上点击次数。

【讨论】:

感谢乔希的快速回答。我只是尝试过,但不幸的是没有成功。我仍然有相同的结果。让我知道是否还有其他可以做的。非常感谢! 尝试将 SUM 放在顶部的乘法点击周围 你得到的结果和以前一样吗? 是的,结果完全相同。 嘿@JoshKopen;您可能想要更新您的答案,使其声明:从第二个(外部)GROUP BY 中删除 clicks 并在campaign_cpc*clicks 周围添加SUM()

以上是关于如何对特定列中具有相同值的行求和的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定列中添加具有相同字符串值的行,并且不转换数据框? [重复]

SQL 聚合具有相同 id 的行,辅助列中的特定值

如何对具有相同 ID OpenOffice 的条目求和 - Calc

将列中具有相同值的行合并在一起

如何在SQL Server表列中查找相同值的行

我不能在列中添加具有 2 个相同值的行