Повторное сопоставление строк поворотных данных с динамическим количеством групп выходных столбцов - PullRequest
0 голосов
/ 09 февраля 2019

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

    CREATE TABLE [tmp].[initial_data](
    [username] [varchar](25) NULL,
    [content] [varchar](4) NOT NULL,
    [ITEM_UIN] [varchar](20) NOT NULL,
    [SESSION_NUM] [varchar](2) NOT NULL,
    [ORDER] [int] NULL,
    [CLASS] [varchar](20) NOT NULL,
    [TYPE] [varchar](50) NULL,
    [RESPONSE] [varchar](500) NULL,
    [SCORE_PATTERN] [varchar](500) NULL,
    [ITEM_SCORE] [decimal](8, 2) NULL
) ON [PRIMARY]

Вот пример данных для исходных данных:

    INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001174058', N'2520', N'MS23026', N'1', 2, N'OP', N'Choice 1 of n', N'C', N'1', CAST(1.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001548698', N'2520', N'MS23026', N'1', 2, N'OP', N'Choice 1 of n', N'A', N'0', CAST(0.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'000997680', N'2520', N'MS23026', N'1', 2, N'OP', N'Choice 1 of n', N'A', N'0', CAST(0.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001174058', N'2520', N'MSA1135', N'1', 1, N'OP', N'Choice 1 of n', N'B', N'0', CAST(0.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001548698', N'2520', N'MSA1135', N'1', 1, N'OP', N'Choice 1 of n', N'C', N'0', CAST(0.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'000997680', N'2520', N'MSA1135', N'1', 1, N'OP', N'Choice 1 of n', N'A', N'1', CAST(1.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001174058', N'2520', N'MSA1400', N'1', 3, N'OP', N'Inline Choice', N'C:A', N'0:1', CAST(0.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'001548698', N'2520', N'MSA1400', N'1', 3, N'OP', N'Inline Choice', N'B:A', N'1:1', CAST(1.00 AS Decimal(8, 2)))
GO
INSERT [tmp].[initial_data] ([username], [content], [ITEM_UIN], [SESSION_NUM], [ORDER], [CLASS], [TYPE], [RESPONSE], [SCORE_PATTERN], [ITEM_SCORE]) VALUES (N'000997680', N'2520', N'MSA1400', N'1', 3, N'OP', N'Inline Choice', N'A:B', N'0:0', CAST(0.00 AS Decimal(8, 2)))
GO

Я хочу повернуть уже повернутые данные, чтобы каждыйстрока содержит имя пользователя и содержимое, а остальные столбцы становятся группами столбцов в конечном выводе, причем каждый столбец в группе использует значение [order] в качестве _ {value} в конце имени каждого столбца.Вот как я хотел бы, чтобы окончательный набор данных выглядел следующим образом:

CREATE TABLE [tmp].[finalpvt](  
    [username] [varchar](7) NOT NULL,
    [content] [varchar](4) NOT NULL,
    [ITEM_UIN_1] [varchar](7) NOT NULL,
    [SESSION_NUM_1] [varchar](1) NOT NULL,
    [ORDER_1] [varchar](1) NOT NULL,
    [CLASS_1] [varchar](2) NOT NULL,
    [TYPE_1] [varchar](13) NOT NULL,
    [RESPONSE_1] [varchar](1) NOT NULL,
    [SCORE_PATTERN_1] [varchar](1) NOT NULL,
    [ITEM_SCORE_1] [varchar](1) NOT NULL,
    [ITEM_UIN_2] [varchar](7) NOT NULL,
    [SESSION_NUM_2] [varchar](1) NOT NULL,
    [ORDER_2] [varchar](1) NOT NULL,
    [CLASS_2] [varchar](2) NOT NULL,
    [TYPE_2] [varchar](13) NOT NULL,
    [RESPONSE_2] [varchar](1) NOT NULL,
    [SCORE_PATTERN_2] [varchar](1) NOT NULL,
    [ITEM_SCORE_2] [varchar](1) NOT NULL,
    [ITEM_UIN_3] [varchar](7) NOT NULL,
    [SESSION_NUM_3] [varchar](1) NOT NULL,
    [ORDER_3] [varchar](1) NOT NULL,
    [CLASS_3] [varchar](2) NOT NULL,
    [TYPE_3] [varchar](13) NOT NULL,
    [RESPONSE_3] [varchar](3) NOT NULL,
    [SCORE_PATTERN_3] [varchar](3) NOT NULL,
    [ITEM_SCORE_3] [varchar](1) NOT NULL
) ON [PRIMARY]
GO

Вот данные для этой таблицы для окончательного результата:

INSERT [tmp].[finalpvt] ([username], [content], [ITEM_UIN_1], [SESSION_NUM_1], [ORDER_1], [CLASS_1], [TYPE_1], [RESPONSE_1], [SCORE_PATTERN_1], [ITEM_SCORE_1], [ITEM_UIN_2], [SESSION_NUM_2], [ORDER_2], [CLASS_2], [TYPE_2], [RESPONSE_2], [SCORE_PATTERN_2], [ITEM_SCORE_2], [ITEM_UIN_3], [SESSION_NUM_3], [ORDER_3], [CLASS_3], [TYPE_3], [RESPONSE_3], [SCORE_PATTERN_3], [ITEM_SCORE_3]) VALUES (NULL, N'1569945', N'2520', N'MSA1135', N'1', N'1', N'OP', N'Choice 1 of n', N'B', N'0', N'0', N'MS23026', N'1', N'2', N'OP', N'Choice 1 of n', N'C', N'1', N'1', N'MSA1400', N'1', N'3', N'OP', N'Inline Choice', N'C:A', N'0:1', N'0')
GO
INSERT [tmp].[finalpvt] ([username], [content], [ITEM_UIN_1], [SESSION_NUM_1], [ORDER_1], [CLASS_1], [TYPE_1], [RESPONSE_1], [SCORE_PATTERN_1], [ITEM_SCORE_1], [ITEM_UIN_2], [SESSION_NUM_2], [ORDER_2], [CLASS_2], [TYPE_2], [RESPONSE_2], [SCORE_PATTERN_2], [ITEM_SCORE_2], [ITEM_UIN_3], [SESSION_NUM_3], [ORDER_3], [CLASS_3], [TYPE_3], [RESPONSE_3], [SCORE_PATTERN_3], [ITEM_SCORE_3]) VALUES (NULL, N'1569946', N'2520', N'MSA1135', N'1', N'1', N'OP', N'Choice 1 of n', N'C', N'0', N'0', N'MS23026', N'1', N'2', N'OP', N'Choice 1 of n', N'A', N'0', N'0', N'MSA1400', N'1', N'3', N'OP', N'Inline Choice', N'B:A', N'1:1', N'1')
GO
INSERT [tmp].[finalpvt] ([username], [content], [ITEM_UIN_1], [SESSION_NUM_1], [ORDER_1], [CLASS_1], [TYPE_1], [RESPONSE_1], [SCORE_PATTERN_1], [ITEM_SCORE_1], [ITEM_UIN_2], [SESSION_NUM_2], [ORDER_2], [CLASS_2], [TYPE_2], [RESPONSE_2], [SCORE_PATTERN_2], [ITEM_SCORE_2], [ITEM_UIN_3], [SESSION_NUM_3], [ORDER_3], [CLASS_3], [TYPE_3], [RESPONSE_3], [SCORE_PATTERN_3], [ITEM_SCORE_3]) VALUES (NULL, N'1569947', N'2520', N'MSA1135', N'1', N'1', N'OP', N'Choice 1 of n', N'A', N'1', N'1', N'MS23026', N'1', N'2', N'OP', N'Choice 1 of n', N'A', N'0', N'0', N'MSA1400', N'1', N'3', N'OP', N'Inline Choice', N'A:B', N'0:0', N'0')
GO

Каждое имя пользователя, содержимое, комбос всегда имеют одинаковое количество значений [порядок].Источник всегда будет иметь одинаковые столбцы для поворота.Однако у меня есть несколько различных областей содержимого, которые имеют разные значения в столбце [порядок].Этот пример содержимого «2520» имеет значения столбца [order] 1-67 для каждого имени пользователя и содержимого.Но у меня есть некоторые от 1 до 45, а некоторые от 1 до 80, поэтому я хотел бы, чтобы число повторяющихся групп столбцов было динамичным.Я знаю, как это сделать со всем, что связано со сложностью, используя (max) функцию и операторы case для каждого значения [order], но я хотел бы иметь гибкий или перегружаемый код для работы с каждым другим экземпляром, с которым я сталкиваюсь.Это возможно?Есть ли примеры или функции, которые делают это?Я пробовал оператор PIVOT, но не знаю, как сделать его динамичным.Я использую Microsoft SQL Server 2017. Заранее спасибо за любую помощь.

...