2010-07-07 46 views
40

我需要一些T-SQL查詢的幫助。我要計算具有特殊值的字段(例如> 1)。T-SQL計算具有特定值的行(多個在一個查詢中)

假設我有一個表,如:

IGrp | Item | Value1 | Value2 
############################# 
A | I11 | 0.52 | 1.18 
A | I12 | 1.30 | 0.54 
A | I21 | 0.49 | 2.37 
B | I22 | 2.16 | 1.12 
B | I31 | 1.50 | 0.28 

我要像一個結果:

IGrp | V1High | V2High 
###################### 
A | 1  | 2 
B | 2  | 1 

在我看來這應該是與這個表達式去

SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High 
FROM Tbl GROUP BY IGrp 

但是,這因爲Count()不採用布爾值,所以在T-SQL中不可能。 那麼它真的是唯一可能的方式來做WHERE Value>1COUNT(*)多個查詢,然後加入它們嗎?還是有一個技巧來實現預期的結果?

在此先感謝。

回答

64
SELECT IGrp, 
    COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High, 
    COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High 
FROM Tbl 
GROUP BY IGrp 
+0

任何想法如何影響性能? – BrianFinkel 2011-11-07 02:33:05

+2

根據我的經驗,SQL Server可以很好地使用這個命令。 – jing 2012-09-18 09:46:53

0

您可以在COUNT()函數內部放置CASE .. WHEN ..語句以在條件成立時返回1,否則返回NULL。

3

化妝用的case when會做工作,爲您

SELECT IGrp, 
sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High, 
sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High 
FROM Tbl GROUP BY IGrp 
+0

謝謝, 不知何故,我沒有想到這一點。 – Marks 2010-07-07 10:23:51

+2

這不起作用。所有非空值都包含在計數中。 – LukeH 2010-07-07 10:31:35

+0

現在這也將照顧空值 – 2010-07-07 10:34:28

9

可以使用CASE聲明:

SELECT IGrp, 
    SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High, 
    SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High 
FROM Tbl GROUP BY IGrp 
+2

這不起作用。所有非空值都包含在計數中。 – LukeH 2010-07-07 10:31:11

+1

@LukeH - 是的,你是對的,我的意思是... – cjk 2010-07-07 10:31:53

+0

@HoseynHeydari不,檢查編輯,我改正了,現在這個例子是正確的。如果SO上的回答錯誤,則會被刪除。 – cjk 2017-02-28 19:53:55

2
SELECT IGrp, 
    COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo, 
    COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah 
FROM Tbl 
GROUP BY IGrp 

這也可以用來比較兩個不同的值對於同一領域,如上所示進行小的更改。

對於驗證應該以1:1比例存在的值非常有幫助。

相關問題