Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитическая функция (магазин с максимальным оборотом) / 9 сообщений из 9, страница 1 из 1
25.10.2017, 19:00
    #39541996
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Привет,

Имеется запрос:
Код: plsql
1.
2.
3.
4.
5.
select ltrim(aa.numberx, '0') wallet, 
       sum(case when a.I039_RSP_CD = '00' then a.I006_AMT_BILL else 0 end)
from caccounts aa
inner join authorizations a on a.NUMBER = aa.numberx
group by ltrim(aa.numberx, '0')



В таблице Authorizations есть поле Merchant
Как мне для каждого ltrim(aa.numberx, '0') вытянуть Merchant с максимальным :
sum(case when a.I039_RSP_CD = '00' then a.I006_AMT_BILL else 0 end)

Внутри данной выборки.
Никак у меня мозг не научится аналитические функции встраивать в SQL... Помогите.
...
Рейтинг: 0 / 0
25.10.2017, 19:20
    #39542006
Аналитическая функция (магазин с максимальным оборотом)
Петров Андрей,

групповая first | last и никакой аналитики
...
Рейтинг: 0 / 0
25.10.2017, 19:31
    #39542012
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with t1 as (
            select  ltrim(aa.numberx,'0') wallet,
                    merchant, 
                    sum(
                        case
                          when a.I039_RSP_CD = '00' then a.I006_AMT_BILL
                          else 0
                        end
                       ) over(partition by ltrim(aa.numberx,'0'),merchant) amt
              from      caccounts aa
                    inner join
                        authorizations a
                      on a.NUMBER = aa.numberx
           ),
     t2 as (
            select  wallet,
                    merchant,
                    amt,
                    row_number() over(partition by wallet order by amt desc) rn --
              from  t1
           )
select  wallet,
        merchant,
        amt
  from  t2
  where rn = 1
/



Ну а если merchant' ов с max знaчением несколько? SQL я привeл выберет только одного. Если нужны все, поменяй ROW_NUMBER на DENSE_RANK.

SY.
...
Рейтинг: 0 / 0
25.10.2017, 19:36
    #39542016
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Добрый Э - Эхгрупповая first | last и никакой аналитики

Это как? Тут нужен не merchant с максимальным значеним а с максимальной суммой значений.

SY.
...
Рейтинг: 0 / 0
25.10.2017, 19:43
    #39542024
Аналитическая функция (магазин с максимальным оборотом)
SY,

окау. пусть применит аналитическую форму этих самых первого и последнего... :)
...
Рейтинг: 0 / 0
25.10.2017, 19:49
    #39542032
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Добрый Э - Эхокау. пусть применит аналитическую форму этих самых первого и последнего... :)

Все равно в два этапа.

SY.
...
Рейтинг: 0 / 0
26.10.2017, 17:07
    #39542703
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Т.е. в один заход никак...
А если вот тут вытащить мерчанта с максимальным оборотом для Wallet?

Код: plsql
1.
2.
3.
4.
5.
6.
select ltrim(aa.numberx, '0') wallet, 
       sum(a.I006_AMT_BILL),
       first(merchant) over ...
from caccounts aa
inner join authorizations a on a.NUMBER = aa.numberx
group by ltrim(aa.numberx, '0')



Или тоже в 2 захода только? Просто тянуть всех мерчантов это адский ад... Там куча операций.
...
Рейтинг: 0 / 0
26.10.2017, 17:42
    #39542747
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Я, видимо, не догоняю сомнения коллег.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with caccounts as (select '0011' numberx 
from dual union all select '0123'
from dual union all select '0777'
from dual
), authorizations as (select '0011' "NUMBER",  '00' I039_RSP_CD, 100 I006_AMT_BILL 
from dual union all select '0123', '00', 111
from dual union all select '0123', '00', 111
from dual union all select '0123', '00', 111
from dual union all select '0777', '00', 777
from dual
)
-----------------------------------------------------
select max(ltrim(aa.numberx, '0')) keep (dense_rank first order by sum(case when a.I039_RSP_CD = '00' then a.I006_AMT_BILL else 0 end) desc) wallet
     , max(sum(case when a.I039_RSP_CD = '00' then a.I006_AMT_BILL else 0 end)) s
from caccounts aa
inner join authorizations a on a."NUMBER" = aa.numberx
group by ltrim(aa.numberx, '0')
...
Рейтинг: 0 / 0
27.10.2017, 11:09
    #39543064
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналитическая функция (магазин с максимальным оборотом)
Не вкурил...
Надо же вытащить поле Merchant :-)
Что то вроде этого:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with caccounts as (select '0011' numberx 
from dual union all select '0123'
from dual union all select '0777'
from dual
), authorizations as (select '0011' "NUMBER",  '00' I039_RSP_CD, 100 I006_AMT_BILL, 'AAA' MERCHANT
from dual union all select '0123', '00', 111, 'AAA' MERCHANT
from dual union all select '0123', '05', 222, 'AAA' MERCHANT
from dual union all select '0123', '00', 333, 'BBB' MERCHANT
from dual union all select '0777', '00', 777, 'AAA' MERCHANT
from dual
)
-----------------------------------------------------
select ltrim(aa.numberx, '0'),
       sum(case when a.I039_RSP_CD = '00' then I006_AMT_BILL else 0 end),
       max(merchant) keep (dense_rank first order by sum(case when a.I039_RSP_CD = '00' then a.I006_AMT_BILL else 0 end) desc)
from caccounts aa
inner join authorizations a on a."NUMBER" = aa.numberx
group by ltrim(aa.numberx, '0')



Т.е. на выходе получить:
авторWallet, Sum, Merchant
0011, 100, AAA
0123, 444, BBB (у него максимальная сумма с I039_RSP_CD = '00' по Wallet)
0777, 777, AAA
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитическая функция (магазин с максимальным оборотом) / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]