1

我有一个记录用户活动的表:

AccountID/ContactID/Message/Time/Date 都被记录下来。通常,消息将是一种颜色,红色,绿色等......

任何 AccountID 都可以有多个 ContactID

我想展示的是:

AccountID 红色 绿色 橙色
账户 1 4 5 0
账户2 3 4 1
帐户 3 5 2 1

它基本上计算了不同数量的消息我尝试的是:

select 
  AccountID, 
  count(distinct message where message = 'RED'), 
  count(distinct message where message = 'Green'), 
  count(distinct message where message = 'Orange') 
from
  activities 
where 
  date like '2013-01%';

但它返回错误 1064,我认为我count(distinct....)的甚至不接近有效,但我找不到任何示例,甚至找不到我应该使用的示例。任何帮助都会很棒,谢谢。

4

3 回答 3

2

您可以通过将 CASE 语句与 SUM 聚合函数相结合来做到这一点。例子:

select 
  AccountID, 
  sum(case when message = 'red' then 1 else 0 end) red_msgs, 
  sum(case when message = 'green' then 1 else 0 end) green_msgs, 
  sum(case when message = 'orange' then 1 else 0 end) orange_msgs, 
from
  activities 
where 
  `date` like '2013-01%'
group by 
  AccountID;
于 2013-02-11T17:27:23.370 回答
0

尝试使用CASE

SELECT AccountID, 
  SUM(CASE message WHEN 'Red' THEN 1 ELSE 0 END) AS Red, 
  SUM(CASE message WHEN 'Green' THEN 1 ELSE 0 END) AS Green,
  SUM(CASE message WHEN 'Orange' THEN 1 ELSE 0 END) AS Orange,
FROM activities 
WHERE date like '2013-01%';
于 2013-02-11T17:29:20.457 回答
0

这是替代伯尼的替代品。使用 if 可以更具可读性。

select 
  AccountID, 
  sum(if(message = 'red'),1,0) red_msgs, 
  sum(if(message = 'green',1,0)) green_msgs, 
  sum(if(message = 'orange',1,0) orange_msgs, 
from
  activities 
where 
  date like '2013-01%'
group by 
  AccountID;
于 2013-02-11T17:57:40.503 回答