Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将所有活动分组到同一行中_Sql_Group By_Amazon Redshift - Fatal编程技术网

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

非常感谢这项工作非常完美非常感谢您提出的伟大解决方案