首页 > 解决方案 > 将 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 语句时无法获得正确的语法。

我想知道是否有人可以指出我正确的方向。

谢谢

标签: sqlsql-servertsql

解决方案


使用公用表表达式

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;

推荐阅读