Объединить столбцы в sql - PullRequest
       20

Объединить столбцы в sql

0 голосов
/ 30 ноября 2018

Я использую 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 |
+-----------+----------+--------------+------------+--------+-------------------+--------+

Как выможно увидеть, что все столбцы одинаковы, за исключением столбцов 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 столбцом, но не объединяет строку 1 со строкой 2, что я делаю не так?Привет

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Используйте concat(), затем string agg():

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

Редактировать 1: Если вы не хотите, чтобы /n для последнего значения в строке, вы можетеdo:

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 голосов
/ 30 ноября 2018

Вы можете достичь того, чего ожидаете, используя динамический запрос, чтобы «сводить» столбцы к строкам, а затем вы можете использовать его в сгруппированном запросе для возврата без дубликатов.Вот код из вашего примера.Я заменил ваш запрос на ваши результаты, вставленные в таблицу, но вы можете использовать его для замены моей тестовой таблицы, чтобы протестировать ее в более разных результатах.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...