2012-06-26 41 views
0

你怎麼能Select兩列,並且每列都測試它自己的條件而不是其他條件?在一條select語句中的不同條件

比方說,我有一個選擇Count表中的每個記錄。在一個專欄中,我希望從本週開始記錄每一條記錄,而在第二個專欄中,我希望自今年年初以來的所有記錄。

我有兩個條件,但它們都適用於特定的列:

 WHERE date BETWEEN @Monday AND @SUNDAY /* Weekly */ 
     WHERE date >= @JanuaryFirst    /* Annual */ 

但不能只是把它喜歡這樣,因爲我只在兩列獲得本週的紀錄。我認爲我可以使用IF的條件,但我不認爲我可以簡單地說「如果你是專欄A測試,如果不測試第二個」。

enter image description here

回答

1

內在地運用進行選擇,這樣的:

select vehicule, 
     (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date BETWEEN @Monday AND @SUNDAY) as 'Weekly', 
     (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date >= @JanuaryFirst) as 'Annual' 
from tablename t 
+1

Ooooh不知道這件事。非常感謝先生。 – phadaphunk

+0

@PhaDaPhunk不是最好的解決方案,但它的工作:) –

+0

什麼是最好的解決方案?有點新SQL:P – phadaphunk

2

如果你想避免子查詢,你可以使用:

select vehicule, 
sum(case when date BETWEEN @Monday AND @SUNDAY then 1 else 0 end) as 'Weekly', 
sum(case when date >= @JanuaryFirst then 1 else 0 end) as 'Annual' 
group by vehicule 
3

這裏是一個版本,不會產生多掃描:

select vehicule, 
    weekly = SUM(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 ELSE 0 END), 
    annual = SUM(CASE WHEN date >= @JanuaryFirst THEN 1 ELSE 0 END) 
from dbo.tablename AS t 
GROUP BY vehicule; 

或者你也可以嘗試稍微不詳細:

select vehicule, 
    weekly = COUNT(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 END), 
    annual = COUNT(CASE WHEN date >= @JanuaryFirst THEN 1 END) 
from dbo.tablename AS t 
GROUP BY vehicule; 
+0

謝謝我會嘗試這種方法,因爲我的請求很長,所以當我添加子查詢時,需要4分鐘執行。 – phadaphunk