合并sql中的列

问题描述 投票:2回答:2

我正在使用SQL Server 2017有一个存储过程,我有一个简单的选择加入像:

SELECT
      [p].[legacyKey] AS JobNumber
    , [p].[Name] AS JobName
    , [G].[Label] AS DesignStatus
    , [GS].[Description]  AS ShopStatus
    , [JN].Title
    , [JN].Note
    , 'Remove' AS [Remove]
      FROM [Project] AS [P]
          INNER JOIN [Customer] AS [c] ON [P].[CustomerSoldById] = [C].[CustomerKey]
          INNER JOIN [General] AS [G] ON [P].[StatusKey] = [G].[GeneralKey]
          INNER JOIN [General] AS [GS] ON [P].[ShopsStatus] = [GS].[GeneralKey]
          INNER JOIN ProjectDesign AS PD ON P.ProjectKey = PD.ProjectKey
          INNER JOIN DESIGN AS D ON PD.DesignKey = D.DesignKey
          INNER JOIN JobNotes AS JN ON PD.DesignKey = JN.DesignKey
      WHERE [G].[Extended] = 'Project Status'
      and p.LegacyKey = 18213

此查询的结果是:

+-----------+----------+--------------+------------+--------+-------------------+--------+
| JobNumber | JobNAme  | DesignStatus | ShopStatus | Title  |       Note        | Remove |
+-----------+----------+--------------+------------+--------+-------------------+--------+
|      1234 | TestName | Correct      | Inc        | Title1 | Note test design  | Remove |
|      1234 | TestName | Correct      | Inc        | Title2 | note test proyect | Remove |
+-----------+----------+--------------+------------+--------+-------------------+--------+

正如您所看到的,除了TitleNote列之外,所有列都完全相同,是否可以合并Title和Note以仅获取一列而不是两列?,示例:

+-----------+----------+--------------+------------+--------------------------------------------------------------+--------+--+
| JobNumber | JobNAme  | DesignStatus | ShopStatus |                             Note                             | Remove |  |
+-----------+----------+--------------+------------+--------------------------------------------------------------+--------+--+
|      1234 | TestName | Correct      | Inc        | Title1 : Note test design \n , Title2 : note test proyect \n | Remove |  |
+-----------+----------+--------------+------------+--------------------------------------------------------------+--------+--+

我试试

CONCAT([JN].[Title], ': ', STRING_AGG([JN].[Note], '\N'))

但它只是用title列连接note列,但它没有与第2行合并第1行,我做错了什么?问候

sql sql-server tsql
2个回答
1
投票

使用concat()然后string agg()

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=69806c24356e5ef86fd0bfa7a239c82b

编辑1:如果你不想将/n作为字符串中的最后一个值,你可以这样做:

select left(string,len(string)-3) from ( SELECT STRING_AGG(CONCAT(Title, ': ', Note, ' \n'),', ') as string from test ) t

编辑2:如果您有多个作业编号,并且不希望所有值聚合到一行,您可以执行以下操作:

select left(string,len(string)-3) from ( SELECT STRING_AGG(CONCAT(Title, ': ', Note, ' \n'),', ') WITHIN GROUP (ORDER BY JobNumber) as string from test group by JobNumber ) t


0
投票

您可以通过使用动态查询将列“旋转”到行,然后您可以按分组查询使用它来返回没有重复的内容,从而实现您的期望。这是您示例中的代码。我将您的查询替换为插入表中的结果,但您可以使用它来替换我的测试表,以便在更多不同的结果中对其进行测试。

CREATE TABLE test
(
JobNumber int
,JobNAme varchar(25)
,DesignStatus varchar(25)
,ShopStatus varchar(25)
,Title varchar(25)
,Note varchar(50)
,Remove varchar(25)
)

GO

INSERT INTO test(JobNumber,JobNAme,DesignStatus,ShopStatus,Title,Note,Remove)
VALUES
(1234,'TestName','Correct','Inc','Title1','Note test design','Remove')
,(1234,'TestName','Correct','Inc','Title2','Note test proyect','Remove')

GO

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + title + ': ' + Note + ' \n' 
            FROM test 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'WITH CTE AS
(
    SELECT JobNumber,JobNAme,DesignStatus,ShopStatus,'''+@Cols+''' AS Note,Remove 
    FROM test
)
SELECT  JobNumber,JobNAme,DesignStatus,ShopStatus,NOTE,Remove 
FROM CTE
GROUP BY JobNumber,JobNAme,DesignStatus,ShopStatus,NOTE,Remove '
--PRINT @query
EXEC sp_executesql @query
© www.soinside.com 2019 - 2024. All rights reserved.