2011-05-01 59 views
2

我有如下表:SQL查詢使用CASE轉動列時

Bank: 
name val amount 
John 1  2000 
Peter 1  1999 
Peter 2  1854 
John 2  1888 

我想寫一個SQL查詢,得到下列結果:

name amountVal1 amountVal2 
John 2000  1888 
Peter 1999  1854  

到目前爲止,我有這樣的:

SELECT name, 
CASE WHEN val = 1 THEN amount ELSE 0 END AS amountVal1, 
CASE WHEN val = 2 THEN amount ELSE 0 END AS amountVal2 
FROM bank 

然而,它給略有錯誤的結果:

name amountVal1 amountVal2 
John 2000  0 
Peter 1999  0 
John 0   1888 
Peter 0   1854  

如何修改我的查詢以提供正確的表示? 謝謝

回答

13
SELECT 
    name, 
    SUM(CASE WHEN val = 1 THEN amount ELSE 0 END) AS amountVal1, 
    SUM(CASE WHEN val = 2 THEN amount ELSE 0 END) AS amountVal2 
FROM bank GROUP BY name 
+0

這個技巧。我嘗試使用組沒有SUM,它不起作用。我現在看到,您可以使用相同的名稱,並在列amount amount1/2下具有許多不同的值。因此,我假設'按名稱組'不會知道如何處理數字。在這種情況下,我們需要告訴它來解決它們!謝謝您的幫助 – Roger 2011-05-01 02:39:01

3

看起來你需要加入表本身。試試這個:

select bank1.name, bank1.amount, bank2.amount 
from bank bank1 
inner join bank bank2 on 
    bank1.name = bank2.name 
    and bank1.val = 1 
    and bank2.val = 2 
+0

謝謝,我想這也將工作,但我不希望如果可能的話,以創建臨時表。 – Roger 2011-05-01 02:41:07

+1

@Roger:這不會創建任何臨時表。在某些情況下,它甚至可能比「GROUP BY-CASE」方法更快。 – 2011-07-13 09:45:24

+0

但是,如果有人只有'val = 1'或'val = 2'的行,這將顯示不同的結果。或者具有多個具有相同值的行。 – 2011-07-13 09:47:21