2012-04-27 169 views
2

与此处的问题类似: http://forums.asp.net/t/1580379.aspx/1 我试图将普通单元格合并到单个逗号分隔单元格中,但是通过内部连接。SQL从多行合并单元格到单个单元格

我的SQL是:

SELECT DISTINCT tb_Order.OrderNumber, tb_Order.OrderId, 
    tb_Order.orderDate, tb_Order.OrderTotal, 
    tb_OrderStatus.OrderStatus, tb_Order.GroupOrderId, 
    tb_Venue.Title AS Venue 
FROM tb_Order INNER JOIN tb_OrderItem ON tb_Order.OrderId = tb_OrderItem.OrderId 
    INNER JOIN tb_Show ON tb_OrderItem.ShowId = tb_Show.showId 
    INNER JOIN tb_OrderStatus ON tb_Order.OrderStatusId = tb_OrderStatus.OrderStatusID 
    INNER JOIN tb_Venue ON tb_Show.VenueId = tb_Venue.id 
WHERE (tb_Order.OrderId = 705) 

enter image description here

我需要的[地点]以逗号分隔,如:

"Interactive Seating Chart Advanced, Interactive Seating Chart Mode Multi-Click" 
+0

看看http://stackoverflow.com/questions/905818/tsql-comma-separation/913023的 – lyrisey 2012-04-27 00:59:09

+0

可能重复[SQL服务器?我可以用逗号分隔多行合并到一列(HTTP://计算器。 com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows-into-one-column) – 2012-04-27 09:48:02

+0

Andriy - 不是重复的,因为我正在尝试使用连接来完成此操作。 – aron 2012-04-27 17:49:24

回答

0

的一种方式做,这是通过使用侧行处理顺序影响迭代地填充变量,像这样。这样做的缺点是它不能在简单的查询语境中工作,也不是最有效的解决方案。

DECLARE @venues varchar(max) 
     SET @venues = '' 

    SELECT @venues = 
     CASE WHEN @venues = '' THEN v.Title 
     ELSE @venues + ',' + v.Title END 
    FROM tb_Venue v 

    SELECT @venues 

做到这一点的第二种方法是用STUFF和SQL Server XML扩展,像这样:

基于CLR的
 SELECT DISTINCT v.Title, 
     (STUFF(
     (SELECT ',' + v2.Title 
     FROM tb_Venue v2 
     -- uncomment this line if you are going 
     -- to aggregate only by something in the outer query 
     -- WHERE v2.GroupKey = v.GroupKey 
     ORDER BY v2.Title 
     FOR XML PATH(''), TYPE, ROOT 
     ).value('root[1]','varchar(max)'),1,1,'')) as Aggregation 
     FROM tb_Venue v 

一个解决方案通常是最高效的用于该用途的情况下,和一个那些被描述here与其他不太理想的解决方案一大堆沿...

你的问题不是一个根植于一套逻辑,所以没有一个干净的SQL解决方案......