如何使用 SQL Server 将行连接到一个单元格中并在每个单元格之后添加换行符
Posted
技术标签:
【中文标题】如何使用 SQL Server 将行连接到一个单元格中并在每个单元格之后添加换行符【英文标题】:How to concatenate rows into one cell and add break line after each one using SQL Server 【发布时间】:2019-03-12 19:31:47 【问题描述】:我正在使用 SQL Server 2017,我正在尝试创建一个查询,将每位员工的语言和熟练程度连接在一行中。在我的 SQL 数据库中存储信息的表是这样的,例如:
而我想要达到的最终结果是这样的:
使用 Stuff 函数和 xml 路径,我设法创建了一个选择查询,显示如下:
但我找不到插入换行符的方法。该查询将用作 AspxGridview 的数据源。
有什么帮助吗?
提前谢谢你!
到目前为止我的查询:
select distinct
p.PersonID,
STUFF
( (SELECT char(10) + l.Language+' ('+ (case cvnl.Proficiency when 1 then 'Good'
when 2 then 'Very Good'
when 3 then 'Excellent'
end )
+') ' FROM CV_NewLanguages cvnl
inner join Languages l on l.LanguageID = cvnl.LanguageID
WHERE cvnl.PersonID = p.PersonID
ORDER BY l.Language ASC FOR XML PATH('')), 1, 1, '') AS Languages
from CV_Certifications cv
inner join person p on cv.PersonID=p.PersonID
inner join CV_NewLanguages cvnl on cvnl.PersonID=p.PersonID
inner join Languages l on l.LanguageID=cvnl.LanguageID
where active=1
group by
p.PersonID,
cvnl.Proficiency,
l.Language
order by p.PersonID
结果是这样的: enter image description here
【问题讨论】:
即使 SQL Server 2015 不是有效产品,我也使用 SQL Server 进行了标记。 有 no SQL Server 2015 - 我们有 2000、2005、2008、2008 R2、2012、2014、2016、2017 和很快 2019 - 那么您真正使用的是哪一个? 你应该备份一下并发布你最终想要做的事情。这是一个网络应用程序吗?你所建议的不是你会在 SQL Server 中处理的东西。 SQL Server 不擅长。您所解释的内容听起来很像针对数据集的 Presentation Logic,因此提供一些上下文将有助于我们为您提供帮助。 我已经发布了我最终想要做的事情。 excel跟这个有什么关系?我正在使用 devexpress gridvew 来显示有关员工语言级别的信息,并且我试图在每种语言和级别之后插入一个换行符。 Devexpress Gridview 是一种呈现数据的方式。 我同意 kevin_fitz 的观点。你应该在表示层而不是在 SQL 中这样做 【参考方案1】:当您使用 SQL Server 2017 时,您可以使用 STRING_AGG 函数
SELECT
p.PersonID,
STRING_AGG( Language + '(' +
CASE cvnl.Proficiency
WHEN 1 THEN 'Good'
WHEN 2 THEN 'Very Good'
THEN 3 THEN 'Excellent'
END + ')'
, CHAR(13) + CHAR(10)) AS Languages
FROM CV_Certifications cv
JOIN person p on cv.PersonID = p.PersonID
JOIN CV_NewLanguages cvnl on cvnl.PersonID = p.PersonID
JOIN Languages l on l.LanguageID = cvnl.LanguageID
WHERE active=1
GROUP BY p.PersonID,
ORDER BY p.PersonID
您提到 AspxGridview 需要它,因此您可能也需要 html 中断
SELECT
p.PersonID,
STRING_AGG( Language + '(' +
CASE cvnl.Proficiency
WHEN 1 THEN 'Good'
WHEN 2 THEN 'Very Good'
THEN 3 THEN 'Excellent'
END + ')'
, CHAR(13) + CHAR(10) + '<BR/>' + CHAR(13) + CHAR(10)) AS Languages
FROM CV_Certifications cv
JOIN person p on cv.PersonID = p.PersonID
JOIN CV_NewLanguages cvnl on cvnl.PersonID = p.PersonID
JOIN Languages l on l.LanguageID = cvnl.LanguageID
WHERE active=1
GROUP BY p.PersonID,
ORDER BY p.PersonID
如果您使用的是 SQL 以前的版本,或者您想继续使用 STUFF,您可以从 STUFF 的结果中替换逗号
SELECT
p.PersonID,
REPLACE(
STUFF( (
SELECT ',' + l.Language +' (' +
CASE cvnl.Proficiency
WHEN 1 THEN 'Good'
WHEN 2 THEN 'Very Good'
WHEN 3 THEN 'Excellent'
END +') '
FROM CV_NewLanguages cvnl
JOIN Languages l on l.LanguageID = cvnl.LanguageID
WHERE cvnl.PersonID = p.PersonID
ORDER BY l.Language ASC
FOR XML PATH(''))
, 1, 1, '')
,',',CHAR(13) + CHAR(10)) AS Languages
FROM person p
WHERE EXISTS (SELECT 1 FROM CV_Certifications cv WHERE cv.PersonID = p.PersonID)
AND EXISTS (SELECT 1 FROM CV_NewLanguages cvnl WHERE cvnl.PersonID = p.PersonID
AND active=1
ORDER BY p.PersonID
我还随意调整了您的查询
【讨论】:
如果我使用 CHAR(13) + CHAR(10) 我得到这些符号 #x0D; .另外,如果我使用 我也会得到符号并且没有换行符。 如果您在 STUFF 中使用断线或标签,是的,您会因为 XML PATH 获得这些符号,但您是否已经尝试使用 STRING_AGG?? 感谢您的努力。尝试了您提供的上述解决方案,但在熟练级别之后仍然没有折线。我还没有尝试过使用 String_Agg... 如果你想在 SSMS 的结果窗口中看到断线,你不会看到它们...检查你的 GridView 如果没有,也可以尝试使用 ...但我很确定它可以工作【参考方案2】:您可以尝试 Pinal 的以下解决方案。
https://blog.sqlauthority.com/2009/07/01/sql-server-difference-between-line-feed-n-and-carriage-return-r-t-sql-new-line-char/
我在将它的输出绑定到一个水晶报告时使用了这个很长的时间。没有尝试过使用 aspx gridview。
【讨论】:
抱歉,到目前为止还没有帮助到我。以上是关于如何使用 SQL Server 将行连接到一个单元格中并在每个单元格之后添加换行符的主要内容,如果未能解决你的问题,请参考以下文章
如何将行旋转为列,并按过去 7 天显示 - SQL SERVER