SQL Server 2008,如何连接字符串?

3
我浪费了两天时间来解决这个问题,现在我快疯了,我需要紧急帮助, 问题是, 我有两张表
表:销售,SalesId 是主键。
---------------------------------------------------
SalesId | SalesDate | Customer| Discount | Remarks
---------------------------------------------------
1       | 01/01/2012|   John  |   15     |   NULL
2       | 01/01/2012|   Peter |   25     |   NULL
3       | 01/01/2012| Micheal |   35     |   NULL

表格:销售主体,SerialNo主键SalesId外键
---------------------------------------------------
SerialNo | SalesId | Product | Quantity | Rate
---------------------------------------------------
10       | 1       | Pencil   | 18       | 20
11       | 1       | pen      | 200      | 60
12       | 1       | Rubber   | 150      | 10
13       | 1       | Paper    | 500      | 2
14       | 2       | Mouse    | 15       | 190
15       | 2       | KeyBoard | 10       | 600
16       | 2       | Monitor  | 5        | 2000
17       | 3       | Mobile   | 2        | 15000

现在我想进行一个查询,使结果如下所示。
----------------------------------------------------------------------------
SalesId | SalesDate  | Details                               | Amount
----------------------------------------------------------------------------
1       | 01/01/2012 | Sold: Pencil x 18 @ 20, Pen x 200 @ 60| xxxxxxx
        |            |  Rubber x 150 @ 10, Paper x 500 @ 2   |
2       | 01/01/2012 | Sold: Mouse x 15 @ 190, Keyboard x 10 |
        |            |  @ 600, Monitor x 5 @ 2000            | xxxxxxx
3       | 01/01/2012 | Sold: Mobile x 2 @ 15000              | xxxxxxx

我已经尝试了不同的技术,例如Coalesce、Stuff、For XML PATH(''),但我无法将详细字符串连接起来。

据我所知,在SQL Server中,聚合串联并不是一件容易的事情。 - default locale
GROUP_CONCAT在MySQL中的作用,在SQL Server中可以寻找替代方法。参考链接:http://explainextended.com/2010/06/21/group_concat-in-sql-server/。 - kwelsan
1
你为什么要在SQL中尝试做这件事?对于这种情况,客户端语言更好。 - WKordos
1个回答

6
据我所见,您只需要对SalesBody表进行透视并按SalesID分组。类似下面的查询应该可以解决问题。
select sb.SalesId, ( SELECT ', ' + sb2.Product + ' x ' + sb2.Quantity + ' @ ' + sb2.Rate
       FROM SalesBody sb2
       WHERE sb2.SalesId = sb.SalesId 
       FOR XML PATH('') ) AS Details
from SalesBody sb
group by sb.SalesId 

然后只需将该查询与您的销售表连接,以获取其他数据,并在上面的查询中使用STUFF命令来删除前导“,”并添加您的“已售:”字符串,您就可以顺利完成了。


2
不错。要将前导的,替换为已售:,可以使用类似于STUFF((SELECT ...), 1, 1, 'Sold:')的方法。 - Andriy M
@Malik请查看我之前评论中的链接并接受这个答案。此外,您肯定需要访问关于页面 - default locale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接