Ищете элегантное (или любое) решение для преобразования столбцов в строки.
Вот пример: у меня есть таблица со следующей схемой:
[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]
Вот что я хочу получить в результате:
[ID] [EntityId] [IndicatorName] [IndicatorValue]
И значения результата будут:
1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'
И так далее..
Имеет ли это смысл? Есть ли у вас какие-либо предложения о том, где искать и как это сделать на T-SQL?
sql
sql-server
tsql
unpivot
Сергей
источник
источник
Ответы:
Вы можете использовать функцию UNPIVOT для преобразования столбцов в строки:
Обратите внимание, что типы данных столбцов, которые вы отменяете, должны быть одинаковыми, поэтому вам, возможно, придется преобразовать типы данных перед применением отмены.
Вы также можете использовать
CROSS APPLY
UNION ALL для преобразования столбцов:В зависимости от вашей версии SQL Server вы даже можете использовать CROSS APPLY с предложением VALUES:
Наконец, если у вас есть 150 столбцов, которые нужно развернуть, и вы не хотите жестко кодировать весь запрос, вы можете сгенерировать оператор sql, используя динамический SQL:
источник
UNPIVOT
и / против.APPLY
, это сообщение в блоге Брэда Шульца (и последующие ) 2010 года очень красиво.ну, если у вас есть 150 столбцов, я думаю, что UNPIVOT не вариант. Итак, вы можете использовать трюк с xml
sql fiddle demo
Вы также можете написать динамический SQL, но мне больше нравится xml - для динамического SQL у вас должны быть разрешения на выбор данных непосредственно из таблицы, а это не всегда вариант.
ОБНОВЛЕНИЕ
Поскольку в комментариях есть большое пламя, я думаю, что добавлю некоторые плюсы и минусы xml / dynamic SQL. Я постараюсь быть максимально объективным и не упоминать элегантность и некрасивость. Если у вас есть другие плюсы и минусы, отредактируйте ответ или напишите в комментариях
минусы
профи
inserted
иdeleted
таблицы внутри вашего триггера (вообще невозможно с динамическим);источник
Чтобы помочь новым читателям, я создал пример, чтобы лучше понять ответ @ bluefeet о UNPIVOT.
источник
Мне нужно было решение для преобразования столбцов в строки в Microsoft SQL Server, не зная имен столбцов (используемых в триггере) и без динамического sql (динамический sql слишком медленный для использования в триггере).
Я наконец нашел это решение, которое отлично работает:
Как видите, я конвертирую строку в XML (подзапрос выбирает i, * для xml raw, это преобразует все столбцы в один столбец xml)
Затем я ПЕРЕСЕЧЕНИЕ ПРИМЕНЯЮ функцию к каждому атрибуту XML этого столбца, чтобы получить по одной строке для каждого атрибута.
В целом, это преобразует столбцы в строки, не зная имен столбцов и не используя динамический sql. Это достаточно быстро для моей цели.
(Изменить: я только что видел ответ Романа Пекара выше, который делает то же самое. Сначала я использовал динамический триггер sql с курсорами, который был в 10-100 раз медленнее, чем это решение, но, возможно, это было вызвано курсором, а не динамический sql. В любом случае, это решение очень простое универсальное, так что это определенно вариант).
Я оставляю этот комментарий здесь, потому что хочу сослаться на это объяснение в своем сообщении о триггере полного аудита, которое вы можете найти здесь: https://stackoverflow.com/a/43800286/4160788
источник
Вы можете получить список таблиц с количеством строк> 350. Вы можете увидеть в списке решений таблицу в виде строки.
источник
Просто потому, что я не видел об этом упоминания.
Если 2016+, вот еще один вариант динамической отмены сводки данных без фактического использования динамического SQL.
пример
Возвращает
источник