sql - 基于另一个列值合并列值 - TSQL
问题描述
我正在使用下面的查询来合并Message
基于表中“Customer_Name”列的列Customers
SELECT
[Customer_Name],
STUFF((SELECT
', ' + LTRIM(RTRIM([Message]))
FROM [dbo].[Customers] t2
WHERE t2.[Customer_Name] = t1.[Customer_Name]
FOR XML PATH ('')), 1, 1, '')
FROM [dbo].[Customers] t1
GROUP BY [Customer_Name]
使用上面的代码,它们Message
被分隔,,
但我想要一个新行。我尝试使用CHAR(13)+CHAR(10)
但我得到#x0D;
了合并列似乎是错误的。
关于如何解决它的任何想法将不胜感激。
使用@Larnu 帮助回答并在评论中发帖
SELECT
[Customer_Name],
STUFF((SELECT
(CHAR(13) + CHAR(10)) + LTRIM(RTRIM([Message]))
FROM [Customers] t2
WHERE t2.[Customer_Name] = t1.[Customer_Name]
FOR XML PATH (''),TYPE
).value('(./text())[1]','varchar(MAX)'),1,2,'')
FROM [Customers] t1
GROUP BY [Customer_Name]
解决方案
防止 XML 实体化的正确方法xml
实际上是使用选项将其生成为数据类型TYPE
,然后使用.value
DECLARE @sep NVARCHAR(10) = ', '; -- or you can use CHAR(13)+CHAR(10)
SELECT
[Customer_Name],
STUFF(
(SELECT @sep + LTRIM(RTRIM([Message]))
FROM [dbo].[Customers] t2
WHERE t2.[Customer_Name] = t1.[Customer_Name]
FOR XML PATH (''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(@sep), '')
FROM [dbo].[Customers] t1
GROUP BY [Customer_Name]
推荐阅读
- python - 如何根据第一个列表的索引重新排序第二个列表?
- c - 为什么使用 !strcmp 而不是 strcmp?
- pandas - read_csv zip 文件 > 不支持该压缩方法 [pandas]
- c# - Winforms 工具条按钮图像失去颜色
- c - VSCode Intelligence C 扩展不建议有用的词
- c++ - 在 C++ 的子类中使用基类中的运算符重载定义
- node.js - 猫鼬模式参考嵌套数组
- h.264 - 在获得完整视频之前,我可以看到 H.264 视频的开头吗?
- css - 如何在 SCSS 中创建具有 CSS 自定义属性和圆锥渐变的 for 循环?
- angular - Spring,Angular.js 415 不支持的媒体类型错误