如何对特定列中具有相同值的行求和
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()
以上是关于如何对特定列中具有相同值的行求和的主要内容,如果未能解决你的问题,请参考以下文章
如何在特定列中添加具有相同字符串值的行,并且不转换数据框? [重复]