Sql 将所有活动分组到同一行中
我有一张类似的桌子,如下所示。每个客户每个活动的点击次数:Sql 将所有活动分组到同一行中,sql,group-by,amazon-redshift,Sql,Group By,Amazon Redshift,我有一张类似的桌子,如下所示。每个客户每个活动的点击次数: customer activity total tim view 10 tim view 10 anna view 20 anna buy 10 我期望的输出如下表所示: customer view_count view buy_cou
customer activity total
tim view 10
tim view 10
anna view 20
anna buy 10
我期望的输出如下表所示:
customer view_count view buy_count buy
tim 2 20 0 0
anna 1 20 1 10
但是,这是我目前返回的表:
customer view_count view buy_count buy
tim 2 20 0 0
anna 1 20 0 0
anna 0 0 1 10
它不会将anna的所有活动分组到同一行中。这是我尝试过的问题
SELECT customer,
COALESCE(COUNT(CASE WHEN activity = 'view' THEN customer END), 0) AS view_count,
COALESCE((CASE WHEN activity = 'view' THEN SUM(total) END), 0) AS view,
COALESCE(COUNT(CASE WHEN activity = 'buy' THEN customer END), 0) AS buy_count,
COALESCE((CASE WHEN activity = 'buy' THEN SUM(total) END), 0) AS buy,
FROM table
GROUP BY customer, activity
我假设它出现在多行中的原因是,当我按活动分组时,最后一行是“按客户分组”活动。但是,如果我删除它,查询将返回错误,因此我必须包含它
如果您能给我任何建议,我将不胜感激。结束。这个想法是:
SELECT customer,
COUNT(CASE WHEN activity = 'view' THEN customer END) AS view_count,
SUM(CASE WHEN activity = 'view' THEN total ELSE 0 END)AS view,
COUNT(CASE WHEN activity = 'buy' THEN customer END) AS buy_count,
SUM(CASE WHEN activity = 'buy' THEN total ELSE 0 END) AS buy
FROM table
GROUP BY customer ;
请注意,
CASE
表达式是聚合函数的一个参数。您已经非常接近了。你可以做:
select
customer,
sum(case when activity = 'view' then 1 else 0 end) as view_count,
sum(case when activity = 'view' then total else 0 end) as view,
sum(case when activity = 'buy' then 1 else 0 end) as buy_count,
sum(case when activity = 'buy' then total else 0 end) as buy
from t
group by customer
非常感谢这项工作非常完美非常感谢您提出的伟大解决方案