2015-02-28 2 views
0

столбец tran_type таблицы trans_data со значениями, как «V», «M», «MC», «P»PL/SQL-Создание динамических блоков запросов на основе значения столбца

Есть несколько объединений используется в настоящее время, как:

(   
    select count(tran_type) Visa, to_char(request_datetime,'hh24') src_hour from trans_data where tran_type = 'V' group by to_char(request_datetime,'hh24') 
) b on a.src_hour = b.src_hour left join 

    (
    select count(tran_type) Maestro, to_char(request_datetime,'hh24') src_hour from trans_data where switched_type = 'M' group by to_char(request_datetime,'hh24')     
) c on a.src_hour = c.src_hour left join 

выше блок должен был бы быть повторен для дополнительных записей, как «MC» - Mastercard и «P» Paypal. В будущем может быть много других типов транзакций. Есть ли способ, приведенный выше код может быть динамически создан в зависимости от количества tran_type?

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

(   
    select count(tran_type) Visa, to_char(request_datetime,'hh24') src_hour from trans_data where tran_type = 'V' group by to_char(request_datetime,'hh24') 
) b on a.src_hour = b.src_hour left join 

    (
    select count(tran_type) Maestro, to_char(request_datetime,'hh24') src_hour from trans_data where tran_type = 'M' group by to_char(request_datetime,'hh24')     
) c on a.src_hour = c.src_hour left join 

(
    select count(tran_type) PayPal, to_char(request_datetime,'hh24') src_hour from trans_data where tran_type = 'P' group by to_char(request_datetime,'hh24')     
) d on a.src_hour = d.src_hour left join 
+0

Что вы собираетесь делать с оператором SQL? Если вы просто возвращаете вызывающему абоненту слабо типизированный 'sys_refcursor', вы можете использовать динамический SQL для сборки выполняемого вами оператора SQL. Если вы пытаетесь что-то сделать с результатами в PL/SQL, вам нужно будет использовать пакет 'dbms_sql' для выполнения запроса и работы с результатами. Это существенно увеличивает сложность вашего кода. Было бы намного проще, если бы вы вернули одну строку на 'tran_type' за' src_hour', а не пытались динамически добавлять столбцы в результирующий набор. –

+0

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

+0

Что вы делаете с оператором SQL? –

ответ

0

Для таких типов запросов вы должны использовать пункт PIVOT в операторе отбора. Запрошенный список значений tran_type может быть динамически изменен в списке «for tran_type in».

select * from 
(select to_char(request_datetime,'hh24') src_hour, tran_type from trans_data) 
pivot 
(
    count(tran_type) 
    for tran_type in ('V' as "Visa",'M' as "Maestro",'P' as "PayPal") 
) 
order by src_hour 
Смежные вопросы