将所有活动分组到同一行

Group By all activities into the same row

我有一个table类似如下。每个客户每个 activity 的点击次数:

customer     activity       total
tim           view           10
tim           view           10
anna          view           20
anna          buy            10

我想要的输出如下 table:

customer     view_count    view      buy_count      buy 
tim              2          20           0           0
anna             1          20           1          10

但是,这是我目前返回的table:

customer    view_count      view          buy_count         buy 
tim             2            20               0              0
anna            1            20               0              0
anna            0            0                1              10

它不会将 anna 的所有 activity 分组到同一行中。这是我试过的查询

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 

我假设它出现在多行中的原因是因为我按 activity 分组时的最后一行 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