powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитическая функция (магазин с максимальным оборотом)
9 сообщений из 9, страница 1 из 1
Аналитическая функция (магазин с максимальным оборотом)
    #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
Аналитическая функция (магазин с максимальным оборотом)
    #39542006
Петров Андрей,

групповая first | last и никакой аналитики
...
Рейтинг: 0 / 0
Аналитическая функция (магазин с максимальным оборотом)
    #39542012
Фотография 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
Аналитическая функция (магазин с максимальным оборотом)
    #39542016
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхгрупповая first | last и никакой аналитики

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

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

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

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

SY.
...
Рейтинг: 0 / 0
Аналитическая функция (магазин с максимальным оборотом)
    #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
Аналитическая функция (магазин с максимальным оборотом)
    #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
Аналитическая функция (магазин с максимальным оборотом)
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитическая функция (магазин с максимальным оборотом)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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