SQL Подзапрос - Max () после суммирования подгруппы SUM () - PullRequest
1 голос
/ 11 апреля 2020

Я хочу, прежде чем поблагодарить вас за это. Оценил. Я пишу подзапрос, который мне нужен, чтобы получить наибольшую группу доходов для каждого клиента после суммирования деталей, составляющих группы доходов. Таким образом, этот запрос должен получить по одной записи для каждого клиента (потребуется обработать связи, чтобы избежать дублирования в моем основном запросе). Ниже подзапрос (с подзапросом, который мне нужно будет присоединить к моему моему запросу (не показан) по ACCOUNT_ID. Подзапрос, который суммирует, работает, но тогда мне нужно получить запись для каждой учетной записи по ACCOUNT_ID И REV_CODE с наибольшим общим AMOUNT .

Предварительный просмотр не отображается правильно, но будет отображаться.

ACCOUNT_ID   REVENUE_CODE  CHARGE_ITEM   AMOUNT
1234         0210          9011           938.49
1234         0210          8294           546.00
1234         0850          3953           32.50
1234         0850          1023           12.56
1234         0360          1203           1292.98

Мне нужен результат, но для каждого ACCOUNT_ID (не ТОП 1 всех результатов в подзапросе). нужен ACCOUNT_ID и REVENUE_CODE 1234 0210 1484,49

    SELECT
    RC_SUBQ.ACCOUNT_ID
    ,RC_SUBQ.REVENUE_CODE
    ,MAX(RC_SUBQ.RC_SUM)
    FROM 
            (SELECT /* SORTED DESC ON AMOUNT. I NEED THE TOP RECORD FOR EACH ACCOUNT_ID */
                HTR.ACCOUNT_ID
                ,HTR.REVENUE_CODE
                ,SUM(AMOUNT) AS 'RC_SUM' 
            FROM TRANSACTIONS HTR
            GROUP BY HTR.HSP_ACCOUNT_ID,
                HTR.REVENUE_CODE
            ORDER BY HTR.ACCOUNT_ID,SUM(AMOUNT) DESC
            ) RC_SUBQ

            GROUP BY
            RC_SUBQ.HSP_ACCOUNT_ID
            ,RC_SUBQ.REVENUE_CODE

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Это сделает это за вас.

create table Transactions
(
  ACCOUNT_ID int
, REVENUE_CODE char(4)
, CHARGE_ITEM char(4)
, AMOUNT decimal(10,2)
)

insert into Transactions values
  (1234, '0210', '9011', 938.49)
, (1234, '0210', '8294', 546.00)
, (1234, '0850', '3953', 32.50)
, (1234, '0850', '1023', 12.56)
, (1234, '0360', '1203', 1292.98)
, (1245, '0970', '1238', 123.97)
, (1245, '0970', '1223', 166.03)
, (1245, '0560', '1239', 400.00)

select * from Transactions

select *
from (
select 
  HTR.ACCOUNT_ID
, HTR.REVENUE_CODE
, SUM(HTR.AMOUNT) as [RC_SUM]
, row_number() over (partition by HTR.ACCOUNT_ID 
                     order by SUM(HTR.AMOUNT) desc) as [ROW_NUMBER]
from Transactions HTR
group by 
  HTR.ACCOUNT_ID
, HTR.REVENUE_CODE
) x
where x.ROW_NUMBER = 1

Вот демоверсия .

0 голосов
/ 11 апреля 2020

Вы можете использовать ROW_NUMBER() и оконную функцию PARTITION BY для перечисления нескольких сумм.

ROW_NUMBER() OVER (PARTITION BY HTR.ACCOUNT_ID, HTR.REVENUE_CODE ORDER BY RC_SUM DESC) AS RowNumber

Итак, что-то вроде этого:

(SELECT /* SORTED DESC ON AMOUNT. I NEED THE TOP RECORD FOR EACH ACCOUNT_ID */
    ROW_NUMBER() OVER (PARTITION BY HTR.ACCOUNT_ID, HTR.REVENUE_CODE ORDER BY RC_SUM DESC) as RowNumber,
    HTR.ACCOUNT_ID
    ,HTR.REVENUE_CODE
    ,SUM(AMOUNT) AS 'RC_SUM' 
FROM TRANSACTIONS HTR
GROUP BY HTR.HSP_ACCOUNT_ID,
    HTR.REVENUE_CODE
ORDER BY HTR.ACCOUNT_ID,SUM(AMOUNT) DESC
) RC_SUBQ

Затем вы можете отфильтровать WHERE RowNumber = 1 во внешнем объеме

...