Преобразование данных в столбце в строку в SQL Server - PullRequest
0 голосов
/ 24 сентября 2019

Довольно плохо знаком с SQL, поэтому я приношу свои извинения!

В настоящее время у меня есть следующий SQL-запрос:

select [data]
from Database1.dbo.tbl_Data d
join Database1.tbl_outbound o on d.session_id = o.session_id
where o.campaign_id = 1047
  and d.session_id = 12

Это возвращает ОДИН столбец, который выглядит следующим образом (и может возвращать разныеколичество строк в зависимости от campaign_id и session_id!):

    [data]

[1] Entry 1
[2] Entry 2
[3] Entry 3
[4] Entry 4
[5] Entry 5
    .....
[98] Entry 98
[99] Entry 99

Я хочу преобразовать данные, чтобы они отображались в 1 строке, а не в 1 столбце, например:

    [data1]  [data2]  [data3]  [data4]  [data5] .... [data98]  [data99]

[1] Entry 1  Entry 2  Entry 3  Entry 4  Entry 5 .... Entry 98  Entry 99

Надеюсь, я объяснил это достаточно хорошо!Спасибо!:)

Я видел некоторую информацию о Pivot и Unpivot, но не смог заставить ее играть в мяч!

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Попробуйте этот динамический sql, который поможет вашему требованию

IF OBJECT_ID('tempdb..#Temp')IS NOT NULL
DROP TABLE #Temp
CREATE TABLE #Temp (data VARCHAR(100))
GO
IF OBJECT_ID('tempdb..#FormatedTable')IS NOT NULL
DROP TABLE #FormatedTable
Go

INSERT INTO #Temp(data)
SELECT  'Entry1' UNION ALL
SELECT  'Entry2' UNION ALL
SELECT  'Entry3' UNION ALL
SELECT  'Entry4' UNION ALL
SELECT  'Entry5'

SELECT ROW_NUMBER()OVER(ORDER BY Data) AS SeqId, 
        Data,
        'Data'+CAST(ROW_NUMBER()OVER(ORDER BY Data) AS VARCHAR(100)) AS ReqColumn
INTO #FormatedTable
FROM #Temp

DECLARE  @Sql nvarchar(max),
         @DynamicColumn nvarchar(max),
         @MaxDynamicColumn nvarchar(max)


SELECT @DynamicColumn = STUFF((SELECT  ', '+QUOTENAME(ReqColumn)
FROM #FormatedTable  FOR XML PATH ('')),1,1,'') 

SELECT @MaxDynamicColumn = STUFF((SELECT  ', '+'MAX('+(ReqColumn)+') AS '+QUOTENAME(CAST(ReqColumn AS VARCHAR(100)))
FROM #FormatedTable   FOR XML PATH ('')),1,1,'') 

SET @Sql=' SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS SeqId, '+ @MaxDynamicColumn+'
            FROM
            (
            SELECT * FROM #FormatedTable
            ) AS src
            PIVOT 
            (
            MAX(Data) FOR [ReqColumn] IN ('+@DynamicColumn+')
            ) AS Pvt
            '
EXEC (@Sql)
PRINT @Sql

Результат


SeqId   Data1   Data2   Data3   Data4   Data5
----------------------------------------------
1       Entry1  Entry2  Entry3  Entry4  Entry5
0 голосов
/ 24 сентября 2019

Самый простой способ сделать это - использовать SQLCLR.

Ознакомьтесь с решением и объяснением по Более простой способ переноса результата запроса в SQL Server

0 голосов
/ 24 сентября 2019

Не существует простого способа.Вы можете использовать pivot или условное агрегирование.Я предпочитаю последнее:

select max(case when left(data, 3) = '[1]' then data end) as data_001,
       max(case when left(data, 3) = '[2]' then data end) as data_002,
       max(case when left(data, 5) = '[100]' then data end) as data_100       
from Database1.dbo.tbl_Data d join
     Database1.tbl_outbound o
     on d.session_id = o.session_id
where o.campaign_id = 1047 and d.session_id = 12;

Обратите внимание, что столбцы фиксированы , поэтому у вас всегда будет 100 столбцов, независимо от количества фактических значений в данных.

Если вам нужно гибкое количество столбцов, то вам нужно динамическое вращение, которое требует построения запроса в виде строки и последующего ее выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...