2017-03-06 24 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