2017-03-06 23 views
1

我正在尋找將行分成2行或3行。這可能嗎?
我有一個表,顯示行情如下:SQL:將單行分成2行或3行

表名:行情

ID | NAME | BusCost | TaxiCost | TrainCost 
------------------------------------------- 
01 | Steve | NULL | 25  | NULL 
02 | Barry | 15  | 30  | NULL 
03 | Bob | 150  | 400  | 300 

但我想說明這樣的行情:

ID | Name | Cost 
------------------ 
01 | Steve | 25 
02 | Barry | 15 
02 | Barry | 30 
03 | Bob | 30 
03 | Bob | 100 
03 | Bob | 70 

我猜我我將需要使用某種UNION來做到這一點,但我很茫然。我對SQL相對比較陌生,並且希望任何人都能指向正確的方向。

我來(不是很緊密要麼)最接近的是這樣:

SELECT COST 
FROM 
(
SELECT BusCost AS COST FROM Quotes 
UNION 
SELECT TaxiCost AS COST FROM Quotes 
UNION 
SELECT TrainCost AS COST FROM Quotes 
) A 
GROUP BY COST 

SELECT id, name FROM Quotes 
UNION ALL 
SELECT COST 
FROM 
(
SELECT BusCost AS COST FROM Quotes 
UNION 
SELECT TaxiCost AS COST FROM Quotes 
UNION 
SELECT TrainCost AS COST FROM Quotes 
) A 
GROUP BY COST 

任何幫助將不勝感激。

+0

'UNION'刪除重複項,所以如果Bob在busride上花費30美元而在訓練器上花費30美元,則最終只會輸入一個'30'項。要保持重複,請使用'UNION ALL'。您也可能想看看'PIVOT'' – HoneyBadger

+0

您對Bob的期望結果似乎與輸入數據不匹配。是否有一些特殊的數學運算,還是僅僅是一個錯字? –

回答

1
SELECT * 
FROM (
     SELECT id 
     ,  Name 
     ,  BusCost as Cost 
     FROM Quotes 
     UNION ALL 
     SELECT id 
     ,  Name 
     ,  TaxiCost 
     FROM Quotes 
     UNION ALL 
     SELECT id 
     ,  Name 
     ,  TrainCost 
     FROM Quotes 
     ) AllCosts 
WHERE Cost IS NOT NULL 

where子句刪除不具有成本,例如當TaxiCost是空行。使用union all而不是union:後者刪除重複的行。

+0

非常感謝!工作過一種享受! – JohnDow