2009-10-12 5 views
0

У меня есть таблицы SQL, которая возвращает результат следующим образом:Convert «плоский» результат 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) внизу, это было бы здорово. Я могу сделать calc во время выполнения, но хотел бы сделать это и на стороне сервера, если смогу.

+0

Что вы используете? –

+0

SQL Server 2008 – 2009-10-12 16:32:17

ответ

0

взгляд на использование pivot

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; 

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

+0

Это помогло мне найти эту ссылку http://www.tsqltutorials.com/pivot.php. Решила мою проблему, плюс эта ссылка показала мне, как великие вещи тоже. Спасибо! – 2009-10-12 16:33:04

0

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

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

0

если вы хотите изменить данные строки в столбцы (AKA шарнирных), наиболее широко поддерживается подход заключается в использовании заявления КОРПУС:

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 не может справиться с этим - для запроса должны быть определены выходные столбцы.