sql - 将 SQL Join Query 语句转换为逗号分隔的行
问题描述
我需要将 SQL Server 数据库中的行转换为逗号分隔值,但在此之前,我需要从查找表中查找 id 值。主表包含一个索引值,查找表包含文本,所以我的 Select 语句看起来像,
SELECT
dbo.tbProgramGrant.ProgramPercent,
dbo.tbProgramGrant.GrantFundingID,
dbo.tbProgram.Acronym
FROM
dbo.tbProgram
INNER JOIN
dbo.tbProgramGrant ON dbo.tbProgram.ProgramID = dbo.tbProgramGrant.ProgramID
如果我将其另存为具有名称的视图,vwProgramCode
我可以使用以下命令创建逗号分隔值:
SELECT DISTINCT
p1.GrantFundingID,
STUFF ((SELECT ', ' + RTRIM(p.Acronym) + ':' + CONVERT(nvarchar(15), p.ProgramPercent)
FROM vwProgramCode p
WHERE p.GrantFundingID = p1.GrantFundingID
FOR XML PATH('')), 1, 1, '') AS codelist
FROM
vwProgramCode p1
GROUP BY
p1.GrantFundingID
但是,我宁愿不使用视图,但在 Select stuff 语句中注入视图 Select 语句时无法获得正确的语法。
我想知道是否有人可以指出我正确的方向。
谢谢
解决方案
使用公用表表达式。
WITH cte AS (
SELECT dbo.tbProgramGrant.ProgramPercent, dbo.tbProgramGrant.GrantFundingID, dbo.tbProgram.Acronym
FROM dbo.tbProgram
INNER JOIN dbo.tbProgramGrant ON dbo.tbProgram.ProgramID = dbo.tbProgramGrant.ProgramID
)
SELECT p1.GrantFundingID
, STUFF((
SELECT ', ' + RTRIM(p.Acronym) +':' + CONVERT(nvarchar(15), p.ProgramPercent)
FROM cte p
WHERE p.GrantFundingID = p1.GrantFundingID
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, 2, '') AS codelist
FROM cte p1
GROUP BY p1.GrantFundingID;
推荐阅读
- php - 如何获取只有当前登录用户之前输入数据库的数据?
- c# - 编码问题C#代码——pictures.Box1.Image = Image.FromFile(@"c:\Pictures\ohms1.jpg");
- flutter - 导航到另一个页面时动画跳过
- java - 未检测到 JDK
- c# - 如何使用嵌套对象作为 Dapper 的查询参数
- kubernetes-helm - 使用 Velero 备份/恢复 Rancher 目录应用程序
- python - PostgreSQL 11:错误 [57P03]:致命:数据库系统处于恢复模式
- modelica - 欧拉求解器在 Dymola 事件附近的时间步长
- java - 春季启动应用程序,组件扫描缺少一些@Component
- python - 如何使用“字符串的切片”.isnumeric() 的条件迭代 df 列