Sql колонку в строку

Sql колонку в строку

1 Репутация автора

Я смог использовать решение Пако Зарате, и оно прекрасно работает. Мне нужно было добавить одну строку («SET ANSI_WARNINGS ON»), но это может быть чем-то уникальным для того, как я его использовал или назвал. Существует проблема с моим использованием, и я надеюсь, что кто-то может помочь мне с этим:

Решение работает только с реальной таблицей SQL. Я попытался сделать это с временной таблицей, а также с таблицей в памяти (объявленной), но она не работает с ними. Поэтому в своем коде вызова я создаю таблицу в базе данных SQL, а затем вызываю SQLTranspose. Опять же, это прекрасно работает. Это именно то, что я хочу. Вот моя проблема:

Для того чтобы общее решение было действительно динамичным, мне нужно создать эту таблицу, в которой я временно храню подготовленную информацию, которую я отправляю в SQLTranspose «на лету», а затем удаляю эту таблицу после вызова SQLTranspose. Удаление таблицы представляет проблему с моим окончательным планом реализации. Код должен запускаться из приложения конечного пользователя (кнопка в форме / меню Microsoft Access). Когда я использую этот процесс SQL (создайте таблицу SQL, вызовите SQLTranspose, удалите таблицу SQL), приложение конечного пользователя обнаружит ошибку, поскольку используемая учетная запись SQL не имеет прав на удаление таблицы.

Поэтому я полагаю, что есть несколько возможных решений:

Найдите способ заставить SQLTranspose работать с временной таблицей или объявленной табличной переменной.

Выясните другой метод для транспонирования строк и столбцов, который не требует реальной таблицы SQL.

Найдите подходящий метод, позволяющий учетной записи SQL, используемой моими конечными пользователями, удалять таблицу. Это одна общая учетная запись SQL, закодированная в моем приложении Access. Похоже, что разрешение является привилегией типа dbo, которая не может быть предоставлена.

Я признаю, что кое-что из этого может потребовать другой, отдельной темы и вопроса. Однако, поскольку существует вероятность того, что одно решение может быть просто другим способом сделать транспонирование строк и столбцов, я сделаю мой первый пост здесь в этой теме.

РЕДАКТИРОВАТЬ: Я также заменил сумму (значение) с макс (значение) в 6-й строке от конца, как предложил Пако.

Я понял что-то, что работает для меня. Я не знаю, является ли это лучшим ответом или нет.

У меня есть учетная запись пользователя только для чтения, которая используется для выполнения потоковых процедур и, следовательно, для создания отчетов из базы данных. Поскольку созданная мной функция SQLTranspose будет работать только с «легитимной» таблицей (не объявленной и не временной), я должен был найти способ для учетной записи пользователя, доступной только для чтения, создать (а затем удалить) таблицу ,

Читайте также:  Wifi direct для андроид

Я рассуждал, что для моих целей разрешено создавать таблицы для учетной записи пользователя. Пользователь по-прежнему не может удалить таблицу. Моим решением было создать схему, в которой учетная запись пользователя будет авторизована. Затем всякий раз, когда я создаю, использую или удаляю эту таблицу, ссылаюсь на нее с указанной схемой.

Сначала я выполнил эту команду из учетной записи ‘sa’ или ‘sysadmin’: CREATE SCHEMA ro AUTHORIZATION

Когда я в любое время обращаюсь к своей таблице «tmpoutput», я указываю ее, как в следующем примере:

Когда работаешь с базой данных, пишешь SQL запросы или инструкции, может возникнуть необходимость получить в виде текстовой строки значения определенного столбца таблицы, где каждое значение будет отделяться разделителем, например, запятой или точкой с запятой. В этой статье я покажу, как реализовать это на языке T-SQL, т.е. как получить значения столбца в строке через запятую.

В каких случаях может потребоваться получать значения столбца, разделенные запятой в строке? Например, самый простой вариант — это для реализации какой-нибудь динамической процедуры или инструкции (подробней об этой возможности языка T-SQL в материале – «Выполнение динамических T-SQL инструкций в Microsoft SQL Server»). Если приводить более конкретный пример, то на практике очень часто нужно реализовывать так называемый динамический PIVOT, для формирования аналитических отчетов. PIVOT, если кто не знает, — это оператор, с помощью которого можно формировать сводные таблицы, в частности осуществлять транспонирование таблицы (значения по горизонтали выводить по вертикали с агрегацией и группировкой).

Итак, давайте приступим.

Исходные данные для примеров

Сначала давайте создадим данные, которые мы будем обрабатывать, чтобы суть наших действий была понятна.

Допустим, у нас будет таблица TestTable, которая будет содержать данные о товарах, такие как: идентификатор, наименование, цена и дата.

Примечание! Статья предполагает, что у Вас уже есть базовые знания языка T-SQL, поэтому о том, как создается таблица или как добавляются данные в таблицу, я пояснять не буду. Если Вы начинающий программист и у Вас нет базовых знаний, то я Вам рекомендую почитать книгу «Путь программиста T-SQL» — это самоучитель по данному языку. Книга написана мной, в ней я очень подробно рассказываю практически обо всех конструкциях языка T-SQL.

Пример 1 – выводим все значения столбца в строке через запятую

Давайте представим, что нам нужно получить все значения из столбца «Наименование товара» (ProductName) в виде текстовой строки с разделителем.

Читайте также:  Linux изменить дату создания файла

В примере ниже мы напишем простую SQL инструкцию, в которой мы сохраним в переменной строку из значений столбца, разделенных запятыми.

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

Функцию ISNULL (проверка на NULL) мы использовали для того, чтобы определить, когда нам нужно вставлять первый разделитель, но в данном случае можно использовать и COALESCE, в чем разница можете почитать в статье «Функции COALESCE и ISNULL в T-SQL – особенности и основные отличия».

Функцию QUOTENAME мы используем для отделения каждого значения в строке, в нашем случае квадратными скобами. Это нужно для того, чтобы избежать ситуаций, когда в значении используются пробелы или другие символы. Если отделять значения не требуется, то эту функцию использовать необязательно, также можно вместо квадратных скобок указать другой символ в качестве выделения значения, например, кавычки, круглые или фигурные скобки и некоторые другие (необходимый символ указывается вторым параметром у функции QUOTENAME, по умолчанию квадратные скобки).

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

В предыдущем примере мы выводили все данные из столбца, но в некоторых случаях все значения не нужны, например, для того же динамического PIVOT, где нужны только уникальные значения для формирования заголовков столбцов. Поэтому давайте рассмотрим пример, в котором мы предварительно обработаем наши исходные данные.

Допустим, нам нужно получить в текстовой строке года, которые есть в столбце «Дата» (Dt). При этом нам не нужны повторы, нам нужны только уникальные значения, для этого мы будем использовать ключевое слово DISTINCT.

В столбце Dt у нас хранится дата, поэтому для того, чтобы получить из даты год, мы используем функцию YEAR, подробней о том, как из даты получать различные ее части, мы разговаривали в материале – «Как из даты получить год, месяц или день в T-SQL?».

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

Читайте также:  Mikrotik проброс портов в локальную сеть

Как видим, у нас вывелось всего два значения.

У меня на этом все, надеюсь, материал был Вам интересен и полезен, пока!

Как следует из названия оператора, UNPIVOT выполняет обратную по отношению к PIVOT операцию, т.е. представляет данные, записанные в строке таблицы, в одном столбце. В примере, рассмотренном в предыдущем параграфе, мы с помощью оператора PIVOT разворачивали в строку таблицу, полученную с помощью следующего запроса:

screen avg_
11 700.00
12 960.00
14 1175.00
15 1050.00

В результате было получено следующее представление:

avg_ 11 12 14 15
average price 700.00 960.00 1175.00 1050.00

Исходный результат мы можем получить, если применим к pivot-запросу unpivot-преобразование:

Заметим, что имя avg_ нельзя использовать в операторе UNPIVOT, поскольку оно уже использовалось в операторе PIVOT, поэтому я использовал новое имя avg__, которому затем присвоил алиас, чтобы полностью воссоздать результат, полученный с помощью группировки.

Рассмотрим теперь более содержательный пример. Пусть требуется информацию о рейсе 1100 представить в следующем виде:

trip_no spec info
1100 id_comp 4
1100 plane Boeing
1100 town_from Rostov
1100 town_to Paris
1100 time_out 14:30:00
1100 time_in 17:50:00

Поскольку информация из строки таблицы трансформируется в столбец, то напрашивается использование оператора UNPIVOT. Здесь следует сделать одно замечание. Значения в этом столбце должны быть одного типа. Поскольку в этот столбец в нашем примере собираются значения из разных столбцов исходной таблицы, то нужно преобразовать их к единому типу. Более того, должны совпадать не только типы, но и размер.

Общим типом в нашем случае является строковый тип. Поскольку столбцы town_from и town_to уже имеют тип char(25), то приведем все к этому типу:

trip_no id_comp plane town_from town_to time_out time_in
1100 4 Boeing Rostov Paris 14:30:00 17:50:00

Здесь мы заодно преобразовали время вылета/прилета, убрав из него составляющую даты:

Остальное, я надеюсь, понятно из кода:

Столбец с именем spec используется для вывода названий параметров, а столбец info содержит сами параметры. Результат выполнения запроса уже был представлен в условии задачи.

Ссылка на основную публикацию
Adblock detector