2013-05-02 31 views
3

假设我有以下数据。在两个单独的条件下选择计数

id name_id completed 
1 10   1 
2 10   0 
3 15   1 
4 10   0 
5 20   1 
6 15   0 
7 20   1 
8 15   0 

我试图找到名字的ID,这是非常简单的计数现在

SELECT name_id, COUNT(*) FROM db 
GROUP BY name_id 

,我有我要在查询到包括第二部分。

对于名_ID 10,我要算刚刚那些完成值是1。对于其他名_ID的,我想选择他们,无论他们是否是0或1。

所以我应该结束了:

name_id  count(*) 
10   1 
15   3 
20   2 

名_ID 10只具有计数1,因为它只是已结束1,而其他罪名包括0和1

任何人都可以完成这个任务有所帮助。

谢谢!

回答

4

您可以在您的聚合函数内部使用CASE表达式。

SELECT name_id, 
    sum(case 
      when name_id = 10 
      then case when completed = 1 then 1 else 0 end 
      else 1 end) Total 
FROM db 
GROUP BY name_id; 

SQL Fiddle with Demo

3

排除其中name_id = 10completed = 0行:

SELECT name_id, COUNT(*) FROM db 
WHERE NOT (completed = 0 AND name_id = 10) 
GROUP BY name_id 
1
SELECT name_id, COUNT(*) FROM db 
WHERE name_id != 10 or completed = 1 
GROUP BY name_id 
1

计数时name_id不是10.如果是10,计数当completed = 1:

SELECT 
name_id, 
COUNT(CASE WHEN name_id <> 10 or completed = 1 THEN 1 END) 
FROM db 
GROUP BY name_id