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

#tsql #transpose #dynamic-sql #azure-sqldw

#tsql #транспонировать #dynamic-sql #azure-sqldw

Вопрос:

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

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

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

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

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

Запрос должен быть чем-то вроде —

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

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

Комментарии:

1. Вам нужно исправить свой дизайн; это реальное решение здесь.

2. дизайн выполняется только так.

3. Нет, дизайн этого не делает. Это должно быть нормализовано, как требуемый набор результатов. Кроме того, как вы передаете данные от одного сотрудника к другому в этой таблице? Если у вас есть только эти 2 столбца, то целостность ваших данных уже полностью потеряна.

4. По-видимому, хранилище данных Azure поддерживает STRING_AGG , поэтому вы можете использовать это для создания своего динамического оператора, а затем выполнить его. Затем вы можете использовать это утверждение, чтобы исправить свой дизайн и нормализовать его.

5. все значения, которые вы видите, являются фиктивными.. Я не беспокоюсь о целостности данных здесь.. Мой девиз — создать временную таблицу, в которой в конечном итоге будут указаны имена столбцов в качестве значений, которые я получаю после переноса моей родительской таблицы. Надеюсь, это имеет смысл для вас

Ответ №1:

Однако у меня нет способа проверить, что это работает, из моего searchfu 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);
  

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