2013-04-18 166 views
3

获取计数假设我有一个表states如下:两个不同的条件

create table states (id int4 unique not null, state int4 not null); 

我想在其状态为1,表中的行数,并在表中的行数其状态2.两个单独的查询这样做很简单:

select count(*) from states where state = 1; 
select count(*) from states where state = 2; 

但似乎很傻要经过整个表的两倍。有人能想到一些聪明的伎俩,让我能够在一个声明中获得相同的信息,并且只通过一次表格吗?

回答

5
select 
    count((state = 1)::integer or null) state_1, 
    count((state = 2)::integer or null) state_2 
from states 

select 
    sum((state = 1)::integer) state_1, 
    sum((state = 2)::integer) state_2 
from states 
+0

我结束了使用你的第二个例子,谢谢! –

5

可以使用CASE与聚合函数:

select 
    sum(case when state=1 then 1 else 0 end) State1, 
    sum(case when state=2 then 1 else 0 end) State2 
from states 
1
SELECT [state], COUNT(*) TotalRows 
FROM [Expense].[dbo].[state] 
GROUP BY [state] 

假设您正在使用SQL Server

+0

只有在您想过滤分组记录的记录时才能使用having子句。 – Tamoor

+0

我们可以使用where子句所有其他列likeSELECT [状态],COUNT(*)TotalRows FROM [费用] [DBO]。[状态] WHERE [状态] = 1 GROUP BY [状态] – Tamoor

+0

查询1 SELECT [状态] COUNT(*)总行数 FROM [状态] GROUP BY [状态]查询2 SELECT [状态],COUNT(*)总行数 FROM [state] WHERE [state] = 1 GROUP BY [state] – Tamoor

1
select count(*) from states group by state having state = 1 or state=2; 

使用SQL组通过

+0

你的意思是'state = 1 OR state = 2' –

+0

而'where'出现在'group by'组之前' –

+0

你不能使用,而state = 1和state = 2结果当然是null – linzilan

相关问题