У меня есть требование, при котором мне нужно динамически преобразовывать значения столбцов в заголовки столбцов в Azure SQL DW.

структура таблицы примерно такая, как показано ниже (общее количество записей достигает 150)

введите описание изображения здесь

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

введите описание изображения здесь

По сути, моя идея состоит в том, чтобы создать временную таблицу на лету и определить имена ее столбцов из оператора select, чтобы получить набор результатов, показанный на 2-м рисунке.

Запрос должен иметь вид ---

SELECT * INTO #Cols FROM (select * of above resultset)A WHERE 1=2

Примечание. - Воздержитесь от использования пути FOR XML, поскольку в настоящее время Azure SQL DW не поддерживает эту функцию.


person suraj kumar    schedule 01.09.2020    source источник
comment
Вам необходимо исправить свой дизайн; вот настоящее решение здесь.   -  person Larnu    schedule 01.09.2020
comment
дизайн идет только так.   -  person suraj kumar    schedule 01.09.2020
comment
Нет, в дизайне нет. Он должен быть нормализован, как и набор результатов, который вы хотите. Кроме того, как передать данные от одного сотрудника другому в этой таблице? Если у вас есть только эти 2 столбца, целостность ваших данных уже полностью потеряна.   -  person Larnu    schedule 01.09.2020
comment
По-видимому, хранилище данных Azure поддерживает STRING_AGG, поэтому вы можете использовать его для создания динамического оператора, а затем его выполнения. Затем вы можете использовать этот оператор, чтобы исправить свой дизайн и нормализовать его.   -  person Larnu    schedule 01.09.2020
comment
все значения, которые вы видите, являются фиктивными. Я не беспокоюсь о целостности данных здесь. Мой девиз - создать временную таблицу, в конечном итоге имеющую имена столбцов в качестве значений, которые я получаю после транспонирования моей родительской таблицы. Надеюсь, это имеет для вас смысл   -  person suraj kumar    schedule 01.09.2020
comment
(1) Я согласен с первым комментарием @Larnu, что вам вероятно следует исправить дизайн +1, (2) НО Я ПОЛНОСТЬЮ НЕ СОГЛАСЕН со вторым комментарием! Насколько я понимаю, это хранилище данных Azure, и оно НЕ предназначено для реляционной модели! Хотя в базе данных OLTP мы можем захотеть следовать 12 правилам Кодда и нормализации в некоторых случаях, это совершенно не относится к DW, где мы должны готовить данные для отчетности, ETL, интеллектуального анализа данных, аналитики и так далее. В большинстве случаев (это похоже на красный флаг, но не всегда верно), если я вижу DW, который соответствует правилам нормализации, я знаю, что был выбран неправильный инструмент.   -  person Ronen Ariely    schedule 02.09.2020
comment
Добрый день @surajkumar, На первый взгляд это выглядит как простой случай динамического запроса. обратите внимание, что Azure Synapse поддерживает процедуру sp_executesql и PIVOT. Если вы предоставите полный ожидаемый результат DDL + DML +, тогда мы сможем обсудить конкретное решение (к сожалению, но без DDL + DML, который вы должны предоставить, я обычно не трачу время на тестирование решений). Пингуйте, если добавляете недостающую информацию :-)   -  person Ronen Ariely    schedule 02.09.2020


Ответы (1)


У меня нет возможности проверить, что это работает, однако из моего поиска STRING_AGG доступен в хранилище данных Azure. Я предполагаю, что у него есть доступ к QUOTENAME и есть доступ к динамические операторы, чтобы вы могли сделать что-то вроде этого:

DECLARE @SQL_Start nvarchar(4000) = N'SELECT ',
        @SQL_Columns nvarchar(4000),
        @SQL_End nvarchar(4000) = N'INTO SomeTable FROM YourTable WHERE 1 = 2;';

SET @SQL_Columns = (SELECT STRING_AGG(QUOTENAME(ColumnName),',') WITHIN GROUP (ORDER BY ColumnName)
                    FROM (SELECT DISTINCT ColumnName
                          FROM YourTable) YT);

EXEC(@SQL_Start + @SQL_Columns + @SQL_End);

Но, опять же, реальное решение - исправить ваш дизайн.

person Larnu    schedule 01.09.2020