Поверните данные значения ключа в строку - PullRequest
0 голосов
/ 04 июня 2019

У меня есть данные в таблице в формате сопряжения «ключ-значение» - для каждого Id вы можете иметь несколько key/value значений сопряжения с дополнительным столбцом, определяющим значение таблицы.

DataTable:

ID    Table  Key     Value
--    --     --      --
221   Tab1   Field2  Jon
221   Tab1   Field5  Snow
221   Tab1   Field4  Male
221   Tab1   Field3  Pass
2256  Tab1   Field2  Jil
2256  Tab1   Field5  Dark

Данные в столбце Key относятся к фактическому имени столбца, на которое ссылаются данные (таблицы) в столбце таблицы.

Теперь я хочу повернуть эти данные так, чтобы каждый ID представлялся только как одна строка в соответствующей таблице, а данные копировались в соответствующий столбец:

Tab1:

Id   Field1 Field2  Field3  Field4  Field5  Field6
--   --     --      --      --      --      --
221         Jon     Pass    Male    Snow
2256        Jil                     Dark

Как мне написать это?

1 Ответ

2 голосов
/ 04 июня 2019

Во-первых, образцы операторов DDL / DML:

CREATE TABLE t (ID INT, [Table] VARCHAR(5), [Key] varchar(6), Value varchar(5))
INSERT INTO t VALUES (221, 'Tab1', 'Field2', 'Jon'),
(221 ,'Tab1','Field5','Snow'),
(221 ,'Tab1','Field4','Male'),
(221 ,'Tab1','Field3','Pass'),
(2256,'Tab1','Field2','Jil '),
(2256,'Tab1','Field5','Dark')

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

SELECT *
FROM t 
PIVOT (MAX(Value) FOR [Key] IN ([Field1], [Field2], [Field3], [Field4], [Field5], [Field6]))p

Возвращает:

ID      Table   Field1  Field2  Field3  Field4  Field5  Field6
221     Tab1    NULL    Jon     Pass    Male    Snow    NULL
2256    Tab1    NULL    Jil     NULL    NULL    Dark    NULL

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

DECLARE @sql NVARCHAR(MAX)
SELECT @sql = N'
SELECT p.*
FROM t
PIVOT (MAX(Value) FOR [Key] IN (' + 
    STUFF((SELECT DISTINCT ',' + QUOTENAME([Key]) FROM t FOR XML PATH('')), 1, 1, '') + '))p
'
EXEC sp_executesql @sql

Возвращает:

ID      Table   Field2  Field3  Field4  Field5
221     Tab1    Jon     Pass    Male    Snow
2256    Tab1    Jil     NULL    NULL    Dark

Эта строка:

SELECT STUFF((SELECT DISTINCT ',' + QUOTENAME([Key]) FROM t FOR XML PATH('')), 1, 1, '')

только заключает в скобки и разделяет столбцы в этой строке:

[Field2],[Field3],[Field4],[Field5]
...