我有一个记录用户活动的表:
帐户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....)
甚至接近有效,但我找不到任何例子,甚至我不应该使用它。任何帮助都会很棒,谢谢。
答案 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;