按类型/ contactid计算不同的消息

时间:2013-02-11 17:22:23

标签: mysql sql

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

帐户ID / ContactID /消息/时间/日期都已记录。 通常消息将是颜色,红色,绿色等......

任何AccountID都可以有多个ContactID

我想表现的是:

AccountID     Red    Green    Orange
Account1       4       5         0
Account2       3       4         1
Account3       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....)甚至接近有效,但我找不到任何例子,甚至我不应该使用它。任何帮助都会很棒,谢谢。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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%';

答案 2 :(得分:0)

这是替代bernie的替代品。使用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;