выберите значение счетчика, только если общее количество строк равно числу строк со специальным идентификатором - PullRequest
1 голос
/ 12 октября 2011

Мне нужно выбрать общее количество строк с определенным идентификатором. ЕСЛИ равно максимальному количеству строк в таблице.

Я использую переменные в этом примере, но я хотел бы сделать это только с одним оператором выбора

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 ]

4 голосов
/ 12 октября 2011

Самый быстрый способ, который я могу придумать:

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

Так как вы хотите вернуть все строки, это просто проверяет, соответствуют ли какие-либо строки вашему условию, и если да, то должно возвращать 0 или ничего.

3 голосов
/ 15 октября 2011

Это должно сработать:

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 голосов
/ 12 октября 2011

Я думаю, вы могли бы сделать что-то вроде этого:

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

Но зачем вам один запрос?Работать с такими переменными, как ваш код, гораздо проще для чтения.

2 голосов
/ 12 октября 2011

Вы можете использовать case для возврата 0, если количество совпавших строк отличается от общего количества строк:

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

Это вернет одну строку с 0, если условие не выполнено. Оператор if не будет возвращать набор строк вообще. Возможно, вам придется настроить клиентский код, чтобы учесть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...