преобразовать динамическое количество строк в sql в фиксированное количество столбцов - PullRequest
0 голосов
/ 11 ноября 2019

Мне нужно создать определенный отчет на сервере SQL. Давайте предположим, что есть две таблицы с именами A и B. Я создаю временную таблицу из A и B с именем TMP. TMP может иметь от 0 до 10 записей (это зависит от того, где значение подсказок, которое вводит пользователь). Мне нужно преобразовать эти записи в столбцы в итоговом отчете. Но из-за динамического количества записей TMP и последующего динамического числа столбцов я не могу использовать простой PIVOT.

Я рассмотрел некоторые из подобных вопросов, но ответы не помогли в моей ситуации.

Могу ли я создать пустую временную таблицу с фиксированным номером столбцов (10) и заполнить ее PIVOT TMP? Если нет, то каково ваше решение?

1 Ответ

0 голосов
/ 11 ноября 2019

Ваш вопрос не совсем ясен, но мой волшебный хрустальный шар говорит мне, что вы можете искать что-то вроде этого:

SELECT p.*
FROM
(
    SELECT o.[name]
          ,CONCAT('Column',ROW_NUMBER() OVER(ORDER BY o.object_id)) AS ColumnName
    FROM sys.objects o
    --WHERE ...
) t
PIVOT
(
    MAX([name]) FOR ColumnName IN(Column1,Column2,Column3 /*add as many as you need*/)
) p;

Идея вкратце:

The SELECT вернет список значений. В этом примере я использовал sys.objects и возвращал объект name. Количество строк в этом списке будет зависеть от условия WHERE, но не должно превышать 10 (в вашем случае).

В приведенном выше примере я использую CONCAT() для вычисления имени столбца путем добавления ROW_NUMBER().

Это вычисленное имя столбца можно использовать в PIVOT.

Если ваш список короче 10 строк, вы просто получите NULL.

Но вы должны быть осторожны, если ваш список может быть длиннее 10. В этом случае строки> 10 будут невидимы без какого-либо уведомления ...

...