Транспонирование строк в столбцы (PIVOT) SQL - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть таблица данных, с которой я пытаюсь транспонировать / сводить строки в столбцы.

Я на самом деле с PIVOT / UNPIVOT, и я пытался сделать это, однако из-за агрегации, используемой с PIVOT, я возвращал только 1 результат, который был первым индоссаментом "M06", а не 2 другими индоссаментами длячто PolRef@.

Вот мой пример данных:

CREATE TABLE #temptable ( 
  [B@] int, 
  [key@] varchar(24), 
  [Ref@] varchar(6), 
  [PolRef@] varchar(10), 
  [Sequence@] int, 
  [Date] datetime, 
  [Endnumber] varchar(4), 
  [Desc] varchar(76), 
  [Value] int, 
  [Specdrivers] varchar(76), 
  [Reg] varchar(76)
)

INSERT INTO #temptable VALUES 
( 6, '484F445830314D4330310132', 'HODX01', 'HODX01MC01', 1050, N'2019-09-20T00:00:00', 'M06', 'Garaging/storage', 0, NULL, 'All' ), 
( 6, '484F445830314D433031013C', 'HODX01', 'HODX01MC01', 1060, N'2019-09-20T00:00:00', '046', 'NCB deleted', 0, NULL, 'All' ), 
( 6, '484F445830314D4330310146', 'HODX01', 'HODX01MC01', 1070, N'2019-09-20T00:00:00', '099', 'Limited mileage', 1500, NULL, 'All' )

DROP TABLE #temptable

По существу мне нужен столбец для каждой строки, который говорит "Применимое одобрение" только для значения Endnumber.

Вывод будет выглядеть следующим образом:

|  B@ |   PolRef@   | Applicable Endorsement | Applicable Endorsement | Applicable Endorsement |
|  6  | HODX01MC01  |         M06            |         046            |         099            |

Любые мысли о том, как я могу это сделать, обратите внимание, что может быть любое количество одобрений, это не фиксированная сумма.

Ответы [ 2 ]

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

Попробуйте этот динамический Sql

IF OBJECT_ID('tempdb..#FormatedTable')IS NOT NULL
DROP TABLE #FormatedTable
Go

SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) As SeqId,'Applicable Endorsement'+CAST(ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS VARCHAR(100)) AS ReqColumn,*
INTO #FormatedTable
FROM #temptable

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('+(QUOTENAME(ReqColumn))+') AS '+QUOTENAME(CAST(ReqColumn AS VARCHAR(100)))
FROM #FormatedTable ORDER BY SeqId   FOR XML PATH ('')),1,1,'') 
SELECT @MaxDynamicColumn
SET @Sql=' SELECT [B@],[PolRef@], '+ @MaxDynamicColumn+'
            FROM
            (
            SELECT * FROM #FormatedTable
            ) AS src
            PIVOT 
            (
            MAX(Endnumber) FOR [ReqColumn] IN ('+@DynamicColumn+')
            ) AS Pvt
            GROUP BY [B@],[PolRef@]
            '
PRINT (@Sql)
EXEC (@Sql)

Результат

B@  PolRef@     Applicable Endorsement1  Applicable Endorsement2    Applicable Endorsement3
--------------------------------------------------------------------------------------------
6   HODX01MC01        M06                           046                         099
0 голосов
/ 24 сентября 2019

Вы можете использовать следующее PIVOT:

;WITH PrePivot AS
(
    SELECT
        T.B@,
        T.PolRef@,
        T.Endnumber,
        PivotRanking = ROW_NUMBER() OVER (
            PARTITION BY
                T.B@,
                T.PolRef@
            ORDER BY
                (SELECT NULL)) -- Determine the order here, maybe T.Date?
    FROM
        #temptable AS T
)
SELECT
    P.B@,
    P.PolRef@,
    [Applicable Endorsement] = P.[1],
    [Applicable Endorsement] = P.[2],
    [Applicable Endorsement] = P.[3],
    [Applicable Endorsement] = P.[4],
    [Applicable Endorsement] = P.[5]
FROM
    PrePivot AS V
    PIVOT (
        MAX(V.Endnumber) FOR V.PivotRanking IN ([1],[2],[3],[4],[5])
    ) AS P

Я написал до 5 одобрений, вы можете добавить столько, сколько хотите.Если вам нужна динамическая сумма, вам нужно использовать динамический пивот .

B@  PolRef@     Applicable Endorsement  Applicable Endorsement  Applicable Endorsement  Applicable Endorsement  Applicable Endorsement
6   HODX01MC01  M06                     046                     099                     NULL                    NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...