使用SQL Server CTE从下线记录中获取总计数和总金额的总和

qfe3c7zg  于 2022-12-17  发布在  SQL Server
关注(0)|答案(1)|浏览(180)

我们如何计数和求和所有下行线到他们的上行线使用SQL。
当前数据:

ST_ID    UPLINE   AMOUNT
  ---------------------------
  44930   52001    400
  52016   52001    300
  52001   9024     432
  76985   9024     100
  12123   35119    234
  12642   35119    213
  12332   23141    654

在上表中,uplinedata52001两个ST_ID,金额分别为400300,总和为700,ST_ID具有52001以及金额400,因此5201总量将是400 + 300 + 432 = 1132,且同样地,上行线9024具有52001ST_ID432 + 700以及1132的总量。
预期输出:

UPLINE   AMOUNT  CNT
  ------------------------
  52001    1132    2       (400 +300 + 432 | 1+1+1)
  9024     1232    4       (700 + 432 + 100 | 2+1+1 = 4)
  35119    447     2       (234 + 213 | 1+1 = 2)
  23141    654     1

我想到了递归CTE,但无法收集逻辑。有人有什么想法来实现这一点吗?我使用的是SQL Server 2016。

fbcarpbf

fbcarpbf1#

正如我所理解的,Upline列连接到ST_ID列,并且您希望找到按(Upline + ST_ID中的所有匹配值)分组的总和和计数,即Upline = 9024连接到ST_ID = 52001,因此Upline = 9024的总和将是(9024中的432 + 100加上52001中的300 + 400)。
可以按如下方式使用递归CTE:

With CTE As
(
  Select ST_ID, Upline, Amount From table_name
  Union All
  Select T.ST_ID, T.Upline, C.Amount
  From table_name T Join CTE C
  On C.Upline = T.ST_ID
)
Select Upline, 
       Sum(Amount) As Amount, 
       Count(*) As Cnt
From CTE
Group By Upline

参见demo
根据新要求进行更新(除了先前查询的总和外,还添加ST_ID=Upline的值的总和):

With CTE As
(
  Select * From table_name
  Union All
  Select T.ST_ID, T.Upline, C.AMOUNT
  From table_name T Join CTE C
  On C.Upline = T.ST_ID
)
Select C.Upline, 
       Sum(C.Amount) + ISNULL(Sum(Distinct T.Amount), 0) As Amount, 
       Count(*) + Count(Distinct T.Amount) As Cnt
From CTE C Left Join table_name T
On C.Upline = T.ST_ID
Group By C.Upline

参见demo

相关问题