2014-01-21 153 views
1

我有這樣一個表中火鳥:我應該使用哪個SQL子句?

+-----------+----+------+ 
|vehiclename|oil |volume| 
+-----------+----+------+ 
|v1   |oil1|12 | 
+-----------+----+------+ 
|v2   |oil2|26 | 
+-----------+----+------+ 
|v3   |oil1|45 | 
+-----------+----+------+ 
|v1   |oil2|78 | 
+-----------+----+------+ 
|v2   |oil3|95 | 
+-----------+----+------+ 

,我想作爲

+-----------+----+----+----+ 
|vehiclename|oil1|oil2|oil3| 
+-----------+----+----+----+ 
|v1   |12 |78 |0 | 
+-----------+----+----+----+ 
|v2   |0 |26 |95 | 
+-----------+----+----+----+ 
|v3   |45 |0 |0 | 
+-----------+----+----+----+ 

我已經嘗試使用該表存在的情況下聲明,但沒有結果子句。 任何想法?

回答

2
select vehiclename, 
     sum(case when oil = 'oil1' then volume end) as oil_1, 
     sum(case when oil = 'oil2' then volume end) as oil_2, 
     sum(case when oil = 'oil3' then volume end) as oil_3 
from the_table 
group by vehiclename 
order by vehiclename; 

如果添加新油種,你需要添加一個CASE語句可以在oil欄中顯示的每個值。

如果您需要自動執行此操作,則需要使用動態SQL,其中您首先檢索oil列的不同值,然後按照上述解決方案中的模式創建SQL語句。然後運行該動態SQL語句。

+0

但將這項工作比oil3更多? –

+0

@RaduGheorghiu:看到我的編輯 –

+0

非常感謝!有用 !! ) – kudra

0
SELECT vehiclename, 
sum(CASE WHEN oil = 'oil1' THEN volume END) AS oil1, 
sum(CASE WHEN oil = 'oil2' THEN volume END) AS oil2, 
sum(CASE WHEN oil = 'oil3' THEN volume END) AS oil3 
FROM test 
GROUP BY vehiclename; 

SQL Fiddle [MySQL version]

+0

Firebird不支持(非標準)'ifnull'功能。 –

+0

我沒有注意到「火鳥」.. – kwelsan

+0

@kwelsan:庫德拉做了,在問號標記;) – Getz