Разделить строки данных на столбцы - PullRequest
2 голосов
/ 19 февраля 2009

У меня есть таблица, которая имеет простую структуру:

идентификатор_пользователя, месяц, баланс, тип_баланса

Я хочу отображать выбранные типы баланса в месяц для каждого пользователя, а именно:

идентификатор_пользователя, месяц, баланс_1, баланс_2, баланс_3, баланс _...

Итак, из данных:

ROW user_id month balance balance_type    
1   5667    09   20         2068
2   5667    08   23         2068
3   5667    07   21         2068
4   5667    06   19         2068
5   5667    10   22         2068
6   5667    09   20         2069
7   5667    08   23         2069
8   5667    06   19         2069
9   5667    07   21         2069
10  5667    10   22         2069
11  5667    09   4199       2114
12  5667    06   4329       2114
13  5667    08   4365       2114    
14  5667    10   4172,88    2114    
15  5667    07   4000       2114    
16  5667    10   572,1      6062    
17  5667    08   598,44     6062    
18  5667    07   548,4      6062    
19  5667    06   593,51     6062    
20  5667    09   575,69     6062    

Я бы получил, например, за месяц 09:

user_id, month, balance_1, balance_2, balance_3, balance_4    
5667      09      20        20            4199    575,69

Каково лучшее решение для этого в SQL или / и PL / SQL?

Ответы [ 2 ]

1 голос
/ 19 февраля 2009

Если у вас есть фиксированное количество типов сальдо и (user_id, month, balance_type) являются уникальными кортежами, то вы можете просто выполнить встроенный подзапрос для каждого типа сальдо. Например:

select user_id, month, 
(select balance from balance_table bt where bt.user_id = user_id and bt.month = month and bt.balance_type = '1'),
(select balance from balance_table bt where bt.user_id = user_id and bt.month = month and bt.balance_type = '2') .....
from balance_table

Если возможно иметь несколько строк, имеющих одинаковые balance_type, month и user_id, то вы можете использовать команду pivot для сложения балансов для каждой группы, которая существует как в SQL Server, так и в Oracle (только для 11g). Скажем, например, у вас есть balance_types 1,2,3,4

select * from balance_table pivot (select sum(balance) for balance_type IN (1,2,3,4))

Если вы не знаете, сколько у вас предварительно сбалансированных типов, то я думаю, что динамически сгенерированный sql - единственный путь, и в этом случае вам следует использовать, например, пакет Oracle DBMS_SQL PL / SQL.

1 голос
/ 19 февраля 2009

Если это одноразовое требование, я могу предложить взломать. Используйте несколько самостоятельных объединений для user_id и month (вам потребуется столько объединений, сколько существует типов баланса).

select a.user_id, a.month, a.balance balance_1, b.balance balance_2, c.balance balance_3...
from mytable a, mytable b, mytable c....
where 
a.month = 9 and
a.balance_type=1 and
a.user_id = b.user_id and
a.month = b.month and
b.balance_type=2 and
b.user_id = c.user_id and 
c.user_id = d.user_id and
c.balance_type=3....

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...