Преобразовать «плоский» результат SQL-запроса в структуру таблицы - PullRequest
0 голосов
/ 12 октября 2009

У меня есть таблица Sql, которая возвращает результат следующим образом:

Amount  Descrip
----------------------------
1.34    Group1  Description1
2.36    Group2  Description2
5.46    Group3  Description3
4.54    Group1  Description4
6.23    Group2  Description5

Мне нужно, чтобы это выглядело примерно так.

Descrip      Group1 Group2  Group3 
------------------------------------
Description1 1.34
Description2        2.36 
Description3                5.46
Description4 4.54
Description5        6.23

Следует иметь в виду, что не существует установленного правила, что группа 3 будет существовать или какая-либо группа в этом отношении. Список групп определяется по результатам запроса. Я мог бы иметь Group1, Group2, Group4 и Group6 один раз и не иметь group4, но иметь group5 другой.

Я знаю, что могу сделать это в коде .Net, но это займет много времени в коде. Я бы предпочел сделать это на сервере SQL просто привязать к набору результатов.

В качестве дополнительного комментария, если бы был способ свести значения, чтобы получить общий итог (например, 5,88 для Group1) в нижней части, это было бы здорово. Я могу сделать калькуляцию в кратчайшие сроки, но хотел бы сделать это и на стороне сервера, если смогу.

Ответы [ 3 ]

0 голосов
/ 12 октября 2009

Как сказал SeriousCallersOnly, вам нужно сводное утверждение. К сожалению, чтобы использовать те из них, которые необходимо жестко закодировать в фактических значениях («Group1», «Group2», «Group3» и т. Д.), Которые необходимо изменить Если вы не можете определить их до времени выполнения, вы должны создавать запросы во время выполнения, что означает создание и выполнение динамического кода. Это не просто сделать. Если вам нужно много выполнять такой запрос, вы [должны] получить достаточно хорошие результаты; если вы думаете, что это единственное место, где вы когда-либо будете это делать, то вам, возможно, лучше возложить работу на приложение.

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

0 голосов
/ 12 октября 2009

Когда вы хотите преобразовать данные строки в столбцы (сводка AKA), наиболее широко поддерживаемый подход заключается в использовании операторов CASE:

SELECT t.descrip,
       CASE WHEN t.descrip LIKE 'GROUP 1%' THEN t.amount END 'Group 1',
       CASE WHEN t.descrip LIKE 'GROUP 2%' THEN t.amount END 'Group 2',
       CASE WHEN t.descrip LIKE 'GROUP 3%' THEN t.amount END 'Group 3',
       ...etc

Однако это также означает, что если у вас нет записи для конкретного описания, значение будет отображаться как NULL. SQL - это все или ничего - либо будет присутствовать столбец, либо его нет во всем наборе результатов.

В зависимости от вашей базы данных, есть синтаксис, чтобы помочь. Например, SQL Server поддерживает функцию PIVOT начиная с SQL Server 2005. Oracle добавил ее в 11g. Я не верю, что MySQL или Postgres имеют сводную функциональность - вам придется использовать операторы CASE.

Что касается наличия динамических групп, вам необходимо использовать динамический SQL для соответствия. Ни CASE, ни PIVOT-функциональность не могут справиться с этим - для запроса должны быть определены выходные столбцы.

0 голосов
/ 12 октября 2009

посмотрите на использование пивот

SELECT 'Amount' AS MaxAmount, [Group1], [Group2], [Group3]
  FROM
(SELECT descrip, Amount 
    FROM Table) AS SourceTable
PIVOT
(
Max(Amount)
FOR descrip IN ([Group1], [Group2], [Group3])
) AS PivotTable;

Нужно ввести соответствующую статистическую функцию, для этого примера я использовал максимум.

...