如果总行数等于具有特殊ID的行数,则仅选择计数值

时间:2011-10-12 17:33:24

标签: sql tsql stored-procedures loops ssis

我需要选择具有特定ID IF 的总行数,它等于表格中的总最大行数。

我在这个例子中使用变量,但我想只用一个选择语句

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,因为红色汽车不等于表的总行数

4 个答案:

答案 0 :(得分:4)

我能想到的最快方式:

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

由于你想要返回所有行,这只是检查是否有任何行不符合你的条件,如果是,它应该返回0或什么都没有。

答案 1 :(得分: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 :(得分:2)

如果匹配的行数与总行数不同,您可以使用case返回0

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

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

答案 3 :(得分: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

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