2013-02-11 24 views
1

我有一个表为用户记录活动:按类型/ contactid统计不同的消息

帐户ID /联系人ID /消息/时间/日期都被记录下来。 通常,该消息将是一个颜色,红色,绿色等..

任何帐户ID可以有多种的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....)甚至接近有效,但我找不到任何例子,甚至我应该使用什么。任何帮助将是伟大的,谢谢。

+0

你'date'列的数据类型是char/varchar? – bernie 2013-02-11 17:27:54

回答

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; 
+0

Tom Mac已经(正确)使用了标准的SQL - 但是在MySQL中,您还可以使用SUM(x = y) - 或者MAX(SUM(x = y)) – Strawberry 2013-02-11 17:35:31

+0

谢谢您添加草莓。 FWIW我更喜欢使用标准SQL,因为我经常需要在多个RDBMS中工作:并且最小化从一个系统到另一个系统的翻译时间可能会使我受雇:-) – bernie 2013-02-11 17:37:10

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%'; 
+0

我看@bernie打败了我:-) – 2013-02-11 17:30:10

+0

不用担心,杰夫。你会得到下一个。 – bernie 2013-02-11 17:30:43

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; 
相关问题