Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с реализацией запроса  [new]
RuCosinus
Member

Откуда:
Сообщений: 51
Добрый вечер.
Прошу прощения, за, скорее всего, ламерский вопрос.

Что есть:
Есть 2 таблицы, их упрощенная структура показана ниже:

table_shop
idshopshopname
1shop_1
2shop_2


table_transaction
idtransactionidshoppriznaksumtransdatetrans
11X50 412.0201-apr-2013
22X1 000.0005-apr-2013
32X502.7208-apr-2013
41Y17 213.0810-apr-2013
42Z2 100.9911-apr-2013


Задача:
Написать запрос, который бы вывел результат в следующем виде:

result
id магазинанаименование магазинакол-во операций для priznak=Xсумма операций с priznak=Xкол-во операций для priznak<>Xсумма операций с priznak<>X общая сумма по магазину


Сейчас это реализовано в виде 2-ух view вида:
create or replace view view_X as
select
  a.idshop,
  a.shopname,
  sum(b.sumtrans) as sum_a,
  count(b.idtransaction) as count_a
from table_shop a
left join table_transaction b on b.idshop=a.idshop and
           b.priznak=X and
           b.datetrans between 'начальная_дата' and  'конечная_дата'
where
          a.idshop > 1000
group by a.idshop,a.shopname
order by 1,2;

Из значимого, вторая отличается вьюха от первой только условием, вместо
b.priznak=X and
стоит
b.priznak<>X and

И еще одним запросом все это собирается в одну табличку.
select a.idshop, 
       a.shopname,
       to_char(ROUND(a.sumtrans,2),'999990.00'),
       a.sum_a,
       to_char(ROUND(b.sumtrans,2),'999990.00'),
       b.sum_b,
       to_char((ROUND(a.sum_a,2)+ROUND(b.sum_b,2)),'99990.00')
from view_X a
left join view_not_X b on a.idshop = b.idshop

Что плохо:
Каждый раз даты во вьюшки вбиваются руками и они перекомпилятся %)
Вопрос:
Возможно ли сформировать такую результирующую таблицу одним запросом или придется городить запрос + 2 функции с multiset, дабы функции возвращали таблицы или же вообще все криво и есть способ гораздо аккуратнее и "красивше" ? :)

PS "Мопед не мой" (с) Код такой мне достался :)

Заранее благодарю.
13 апр 13, 21:57    [14177163]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с реализацией запроса  [new]
MazoHist
Guest
RuCosinus,

select shop.idshop
     , shop.shopname
     , sum(case when tran.priznak='X' then 1 else 0 end) count_x
     , sum(case when tran.priznak='X' then tran.sumtrans else 0 end) sum_x
     , sum(case when tran.priznak<>'X' then 1 else 0 end) count_not_x
     , sum(case when tran.priznak<>'X' then tran.sumtrans else 0 end) sum_not_x
     , sum(tran.sumtrans) sumtr
  from table_shop shop
     , table_transaction tran
 where tran.idshop(+) = shop.idshop
 group by shop.idshop
     , shop.shopname 
13 апр 13, 22:49    [14177245]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с реализацией запроса  [new]
RuCosinus
Member

Откуда:
Сообщений: 51
MazoHist,

Огромное спасибо: все логично, просто и красиво.

PS И работает корректно, что не менее важно :)
17 апр 13, 15:29    [14193315]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить