SQL多个结果在一个单元格中

时间:2015-08-12 15:11:24

标签: sql sql-server tsql sql-server-2008-r2

我有一个数据库,其中发票可以链接到多个订单。我希望将订单表中的多个结果放在一个单元格中,但是(这就是问题)我需要按照与主查询相同的方式过滤订单,而不在子查询中重写它们。我怀疑这是可能的,但实际上这个想法是尽可能地依赖主查询,主要是因为列是自动创建的,而且与条件无关。

查询:

SELECT [Invoice].INV_ID AS 'Invoice ID',
       INV_TIT AS 'Invoice title', 
       (SELECT CAST((SELECT ORD_TIT + ' | ' FROM ORD WHERE ORD_ID IN ([Order].ORD_ID) FOR XML PATH('')) AS VARCHAR(MAX))) AS 'Order list'
FROM INV [Invoice]
JOIN INV_ORD [InvoiceOrder] ON [Invoice].INV_ID = [InvoiceOrder].INV_ID 
INNER JOIN ORD [Order] ON [InvoiceOrder].ORD_ID = [Order].ORD_ID
WHERE [Invoice].INV_ID IN (29517, 30951, 42048)
  AND [Invoice].INV_ISDEL = 0
  AND [Order].ORD_DAT = GETDATE()

结果:

╔════════════╦════════════════╦═══════════════════╗
║ Invoice ID ║ Invoice title  ║ Order list        ║
╠════════════╬════════════════╬═══════════════════╣
║ 1          ║ Cinema tickets ║ 1 cinema ticket   ║
║ 1          ║ Cinema tickets ║ 2 cinema tickets  ║
║ 2          ║ Groceries      ║ 1 toothbrush      ║
║ 2          ║ Groceries      ║ 5 shampoo bottles ║
╚════════════╩════════════════╩═══════════════════╝

期望的结果:

╔════════════╦════════════════╦════════════════════════════════════╗
║ Invoice ID ║ Invoice title  ║ Order list                         ║
╠════════════╬════════════════╬════════════════════════════════════╣
║ 1          ║ Cinema tickets ║ 1 cinema ticket | 2 cinema tickets ║
║ 2          ║ Groceries      ║ 1 toothbrush | 5 shampoo bottles   ║
╚════════════╩════════════════╩════════════════════════════════════╝

1 个答案:

答案 0 :(得分:0)

尝试:

create table #tmp (Id int,value1 varchar(max),value2 varchar(max))

insert into #tmp values
(1,'Cinema tickets','1 cinema ticket'),
(1,'Cinema tickets','2 cinema tickets'),
(2,'Groceries','1 toothbrush '),
(2,'Groceries','5 shampoo bottles')


SELECT Id,value1,STUFF(
             (SELECT '|' + value2 
              FROM #tmp where Id=t.Id
              FOR XML PATH (''))
             , 1, 1, '') from #tmp t group by Id,value1