Sql server SQL子查询-子组汇总后的Max()和()

Sql server SQL子查询-子组汇总后的Max()和(),sql-server,group-by,sum,Sql Server,Group By,Sum,我想先感谢你看了这个。谢谢。 我正在编写一个子查询,在总结构成收入组的详细项目之后,我需要为每个客户获得最高收入组。因此,此查询需要为每个客户获取一条记录(需要处理关系以防止在我的主查询中重复)。下面是子查询(带有一个子查询,我需要将该子查询加入到我的帐户ID查询(未显示)中。求和的子查询可以工作,但我需要按帐户ID和总金额最高的修订代码获取每个帐户的记录 SELECT RC_SUBQ.ACCOUNT_ID ,RC_SUBQ.REVENUE_CODE ,MAX(R

我想先感谢你看了这个。谢谢。 我正在编写一个子查询,在总结构成收入组的详细项目之后,我需要为每个客户获得最高收入组。因此,此查询需要为每个客户获取一条记录(需要处理关系以防止在我的主查询中重复)。下面是子查询(带有一个子查询,我需要将该子查询加入到我的帐户ID查询(未显示)中。求和的子查询可以工作,但我需要按帐户ID和总金额最高的修订代码获取每个帐户的记录

    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
预览显示未正确对齐,但将看到

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
    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
我需要结果,但对于每个帐户ID(不是子查询中所有结果的前1个)。真的只需要帐户ID和收入代码 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

您可以使用
ROW_NUMBER()
和窗口函数
PARTITION BY
枚举多个和

    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
ROW_NUMBER() OVER (PARTITION BY HTR.ACCOUNT_ID, HTR.REVENUE_CODE ORDER BY RC_SUM DESC) AS RowNumber
因此,大致如下:

    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
(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

然后,您可以在外部作用域中过滤
其中RowNumber=1
您可以使用
ROW\u NUMBER()
和窗口函数
PARTITION BY
枚举多个和

    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
ROW_NUMBER() OVER (PARTITION BY HTR.ACCOUNT_ID, HTR.REVENUE_CODE ORDER BY RC_SUM DESC) AS RowNumber
因此,大致如下:

    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
(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

然后,您可以在外部范围中过滤
,其中RowNumber=1
,这将为您完成此操作

    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
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

这是你的答案。

这会帮你解决的

    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
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
这是你的电话号码

    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