У меня есть стол ...
SELECT * FROM ALLERGIES;
Результаты в:
Name | Alergy | Alergy Desc | Value
John | Gluten | Gluten Products | Yes
John | Dairy | Milk, Cheese etc | No
Mary | Peanuts | Any kind peanuts | Yes
Dave | Gluten | Gluten Products | No
Dave | Peanuts | Any kind peanuts | Yes
И я хочу, чтобы это выглядело вот так ...
Name | Dairy | Gluten | Peanuts | ...
Dave | NULL | No | Yes |
John | No | Yes | NULL |
Mary | NULL | NULL | Yes |
.
.
.
Другими словами, ведите отдельный список имен в крайнем левом столбце (A-Z) с именами для заголовков столбцов L-R, A-Z.
Я не использую агрегатные функции, поэтому, к сожалению, не могу заставить его работать с PIVOT. Существует несколько имен и несколько предупреждений, поэтому ручная подгонка всех значений для удовлетворения IN (x,y,z) метода PIVOT здесь не подходит, даже если бы я мог создать некоторую форму агрегата.
Любые идеи?
Примечание: Я отбросил описание аллергии в запросе на удаление уровня сложности, но в идеале это будет «Alergy - Alergy Desc» для каждого экземпляра заголовка столбца.
Редактировать: Обновлен заголовок, чтобы явно указать неагрегированные значения, а не решение без агрегирования.
Чтобы заставить PIVOT работать, используйте агрегатную функцию, даже если вам это не нужно; min(value) обычно используется таким образом. Не бойтесь: если есть только одно значение, то min(value) будет равно этому значению, так что вы получите то, что вам нужно. Даже если бы вы избегали оператора PIVOT, вам все равно потребуется агрегирование (например, min(value)) для выполнения поворота «старым способом», с так называемым условным агрегированием.
Другая проблема - это большое количество аллергий ... тогда вам лучше вообще не делать поворота в SQL, а вместо этого использовать возможности поворота вашего приложения для создания отчетов (вы используете его, верно?)
Спасибо за ответы. @mathguy, я использовал агрегат, как вы предложили, но большое количество динамических значений, которые будут использоваться в качестве столбцов, затрудняет использование MAX (value) FOR X IN (val1, val2), поскольку я не могу жестко закодировать эти значения. И, да, я использую приложение для создания отчетов, но я хочу, чтобы оно выводило желаемые результаты из SQL.
@AJQShake - ОК, но тогда ваша проблема не в «транспонировании без совокупности» - проблема не в агрегации. Вам нужно будет использовать динамический SQL; это обычно считается слабым подходом и требует глубоких знаний PL / SQL. Готовы ли вы ответить на этот вызов? Почему бы не сделать это из приложения для отчетов?
@mathguy - я не хочу делать это в приложении для создания отчетов по ряду сложных причин, но я, по сути, хочу, чтобы готовый запрос был помещен в несколько различных ресурсов / настроек без какой-либо конфигурации. Спасибо за вашу помощь. Я изучу динамический SQL. Администратор может пометить это как дубликат stackoverflow.com/questions/46030522/…, поскольку я неправильно назвал его.





Вам необходимо получить список аллергенов (и описания) из этой таблицы во время выполнения; вы не можете жестко запрограммировать их в свой сводный запрос? Если вы не знаете количество столбцов результатов до начала, вам придется использовать динамический SQL.