2011-10-12 62 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