2016-01-26 109 views
0

我的SQL實例如下...如何使用CASE語句GROUP BY?

DECLARE @a TABLE(
    id INT, 
    val BIT 
); 
INSERT INTO @a(id,val) VALUES (1,0),(2,0),(3,1),(4,0),(5,1); 

SELECT 
    id = CASE 
     WHEN val = 1 THEN id 
     ELSE MAX(id) 
    END 
FROM @a 
WHERE val = 0 
GROUP BY id, val; 

什麼我的結果是:

id 
--- 
1 
2 
4 

我想獲得...

id 
--- 
4 

或者,如果我做「哪裏val = 1」那麼我想要的是...

id 
--- 
3 
5 

我基本上想說的是「如果我選擇val = 1的位置,我想要所有的行,但是如果我選擇val = 0的位置,我只想要具有最高ID的行。有任何想法嗎?

+1

不知道你在這裏試圖做什麼。 val = 0時爲什麼只有一行,但當val = 1時都需要兩個?這根本沒有意義。 –

+0

我基本上想說的是「如果val = 1,我想要所有的行,但是如果val = 0,我只想要具有最高id的行」。我會把它放在我的問題中,謝謝。 – felloffthestack

+0

我認爲你已經簡化了你的例子,它不再代表問題了。 –

回答

2

我不知道我是否理解您正在嘗試執行的操作,但以下查詢會給出預期的結果,其中包括WHERE val = 1WHERE val = 0。這個想法是將案件移動到GROUP BY條款

SELECT MAX(id) 
FROM @a 
WHERE val = 1 
GROUP BY CASE WHEN val = 1 THEN id ELSE 0 END 
+0

這是一個非常好奇的解決方案,我非常喜歡它。謝謝! – felloffthestack

+0

@felloffthestack我會一起去 – JamieD77

0

您可以使用UNION語句來組合表格。因此,如果我們分開你想要做成兩個SELECT語句我們所得到的,如果WHERE以下= 0

SELECT MAX(id) 
FROM @a 
GROUP BY ID, VAL 

UNION 

SELECT ID 
FROM @a 
WHERE val = 0 AND val = 1 
GROUP BY ID, VAL 

而且,如果WHERE以下= 1

SELECT MAX(id) 
FROM @a 
GROUP BY ID, VAL 

UNION 

SELECT ID 
FROM @a 
WHERE val = 1 AND val = 1 
GROUP BY ID, VAL 

可能明確爲什麼改變where子句讓它做不同的事情對我來說似乎很陌生。顯然在第一個工會之後的部分是愚蠢的/無用的。在第二種情況下,在where子句中有兩次相同的表達式似乎也很奇怪。但是,這可以滿足您的要求,可以在某個地方更改某個值,並獲得兩個不同的結果

也許你現在可以更好地解釋你的需求了嗎?

+0

對不起,我仍然不確定我是否應該清楚地解釋它,但@ JamieD77找到了我正在尋找的解決方案。 – felloffthestack