2011-10-12 63 views
1

我需要选择具有特定ID的行总数如果它等于表中总的最大行数。只有总行数等于行数与特殊ID时才选择计数值

我使用的变量在这个例子中,但我想只有一个select语句

DECLARE @a int, @b int 

--total with special field (redcar = yes) 
SELECT @a = (SELECT COUNT(*) FROM dbo.car WHERE redcar = 'yes') 

-- max total of table 
SELECT @b = (SELECT COUNT(*) FROM dbo.car) 

IF(@a = @b) 
BEGIN 
SELECT @a 
END 

例 dbo.car

id redcar 
1 yes 
2  
3 yes 
4 
5 
6 

输出应为0做因为红色车不等于表总行数

回答

3

这应该做的伎俩:

SELECT ISNULL(b.numrows, 0) as numrows 
FROM (
    SELECT COUNT(*) AS numrows FROM car 
) a 
LEFT JOIN (
    SELECT COUNT(*) AS numrows FROM car WHERE redcar = 'yes' 
) b ON b.numrows = a.numrows 
2

您可以使用case吨O返回0如果匹配的行数是行的总数量不同:

SELECT case when count(*) = (select count(*) from dbo.car) then count(*) 
     else 0 
     end 
FROM dbo.car 
WHERE redcar = 'yes' 

这将返回0一行,如果条件不满足。 if语句根本不会返回行集。您可能需要调整客户端代码以解决此问题。

+0

运行没有错误,但即使redcars总不表不等于总最大行数我只是得到总的最大行数。我刚刚发布了一张表格。 – tdjfdjdj

+0

@ user719825 - 你试过我的查询了吗? – JNK

+0

@ user719825:已编辑的查询,所以如果rowcount不匹配,返回0 – Andomar

4

我能想到的最快捷的方式:

SELECT COUNT(*) 
FROM dbo.car 
WHERE NOT EXISTS (SELECT 1 FROM dbo.CAR where COALESCE(redcar, '') <> 'yes') 

既然你想返回所有的行,这只是检查是否有任何行不符合你的条件,如果是这样,它应该返回0或没有。

+0

如果'redcar'没有'NULL'值,这将是正确的。 –

+0

这说:对于每一行,检查是否有任何非红色的车。然后统计匹配行的数量。如果没有查询优化器,则会为每行执行一次表扫描,或者使用O(N^2)算法。 – Andomar

+1

@Andomar - 它不相关,所以它只会运行一次检查。 – JNK

2

我想你可以做这样的事情:

SELECT count(*) 
    FROM dbo.car 
HAVING count(*) = sum (Case When redcar = 'yes' Then 1 Else 0 End) 

或本:

SELECT allcars 
    FROM (SELECT COUNT(*) redcars FROM dbo.car WHERE redcar = 'yes') as redcars 
    cross join (SELECT COUNT(*) allcars FROM dbo.car) as allcars 
WHERE redcars = allcars 

但是为什么你要一个查询?处理像你的代码这样的变量更容易阅读。

+0

它运行没有错误,但我只是得到总最大行,即使红车总数不等于表的总最大行数。我刚刚发布了一张表格。 – tdjfdjdj