2012-08-15 119 views
0

如何将以下2个查询合并到一个查询中?SQL:在同一字段中使用不同where子句的2个不同计数

select count(distinct user_id) as action_1_count, date 
from table  
where action = "action_1" 
group by date; 

select count(distinct user_id) as action_2_count, date 
from table 
where action = "action_2" 
group by date; 
+0

你想让他们为两列或两行? – 2012-08-15 17:58:30

回答

0
SELECT COUNT(user_id), date 
FROM table 
WHERE action IN ('action_1', 'action_2) 
GROUP BY action, date 
+0

谢谢。我正在尝试选择2个计数(user_id)列。第一个计算动作1发生次数,第二个计算动作2发生 – user1601130 2012-08-15 18:37:42

+0

@ user1601130对,在'SELECT'后面加上'action' ...'SEELCT动作,COUNT ...' – Kermit 2012-08-15 18:38:39

0

您的查询,可就是这样

SELECT COUNT(user_id), date FROM table WHERE action IN ('action_1', 'action_2') GROUP BY date 

下面是使用SUM()功能本应该做的伎俩

SELECT 
    SUM(action ='action_1') count_1, 
    SUM(action ='action_2') count_2, 
    SUM(action ='action_1' OR action ='action_2') `full_count`, 
    date 
FROM 
table 
GROUP BY date 

与表达式中使用SUM()将导致另一条路在布尔值中,如果action ='action_1'那么结果将是1如果没有的话0,这一切都归结生产基于表达式的结果计数

1

做这样的合并上面的查询:

SELECT date, 
     CASE WHEN action = "action_1" THEN COUNT(user_id) END AS Action1Count, 
     CASE WHEN action = "action_2" THEN COUNT(user_id) END AS Action2Count 
    FROM table  
    WHERE action IN ("action_1", "action_2") 
    GROUP BY date 
+0

这会返回每行1列的值,另一列(取决于行的action1或action2)显示空值 – user1601130 2012-08-15 19:11:11

0

以上答案会给你ACTION_2多行,而看起来你只需要一行action_2。

你可以使用一个联盟:

select '1', count(distinct user_id), date 
from table 
where action = "action_1" 
group by 3 
union 
select '2', count(distinct user_id), max(date) 
from table 
where action = "action_2" 
group by 3; 
+0

虽然查看原始SQL,但是不清楚是否存在简单的省略。 – bcholmes 2012-08-15 18:06:40

相关问题