SQL UPDATE语句将多行合并为一列

时间:2012-07-02 22:09:36

标签: sql sql-server sql-server-2005

我正在处理航空公司数据,所以我有这样的查询

SELECT Invoices.PNR, Segments.Depart, Segments.Arrival, Segments.DepartDateTime
FROM Invoices AS i INNER JOIN Segments AS s
ON i.Invoice_ID = s.Invoice_ID`
WHERE PNR = 'AAAAAA'

返回

PNR    Depart Arrival DepartDateTime
AAAAAA DFW    MCI     7/2/2012 7:30 AM
AAAAAA MCI    LAX     7/2/2012 11:30 AM
AAAAAA LAX    DFW     7/4/2012 2:30 PM

我在Invoices中有一个名为routing的列,我想要显示'DFW-MCI-LAX-DFW'这是否可以使用仅SQL方法?这些细分市场按顺序排列,因此DFW-MCI首先是MCI-LAX然后是LAX-DFW。

编辑:如果我可以用DFW-MCI-MCI-LAX-LAX-DFW更新数据库,那是完全可以接受的。我可以删除视图层上的重复条目。

我可以在ColdFusion中轻松编写这个,但循环和数以千计的数据库更新需要永远。我也可以为每100条记录进行一次批量更新,但我想避免使用除SQL以外的任何其他内容

1 个答案:

答案 0 :(得分:1)

以下是获取价值的方法。我同意@automatic关于您是否应该使用此数据实际更新数据库。因为每次任何行都改变时你都必须重新计算它。

;WITH x AS 
(
  SELECT i.PNR, i.Invoice_ID, s.Depart, s.Arrival, s.DepartDateTime, 
    rn = ROW_NUMBER() OVER (PARTITION BY i.PNR ORDER BY s.DepartDateTime)
  FROM dbo.Invoices AS i 
  INNER JOIN dbo.Segments AS s
  ON i.Invoice_ID = s.Invoice_ID
  WHERE i.PNR = 'AAAAAA'
)
SELECT x.PNR, x.Invoice_ID, Routing = (SELECT 
    CASE WHEN rn1 = 1 THEN Depart ELSE '' END 
    + '-' + Arrival 
    FROM x AS x2
    WHERE x.PNR = x2.PNR
    AND x.Invoice_ID = x2.Invoice_ID
    ORDER BY x2.DepartDateTime
    FOR XML PATH('')
)
FROM x
GROUP BY x.PNR, x.Invoice_ID;