首页 > 解决方案 > 使用预聚合数据更新事务

问题描述

我有一个交易表。我需要使用另一个表中的预聚合值更新表,然后将这些值滚动到不同的粒度级别。

但是,最终输出不正确。希望这里有人可以帮助我弄清楚如何解决这个问题。

Table A:

 TransID   BankName   Location   Region  SaleType  MonthlyPayment Weight

   1        BOA        Boston     East    F          3000           3
   2        Mellon     Pittsburgh East    C          1000           3
   3        BOA        Boston     East    C          2000           2
   4        BOA        Boston     East               1000           2


 Table B

  BanKname   Location      Region   Sales
  BOA         Boston        East     500
  Mellon      Pittsburgh    East     1000


  Desired Output structure

  BankName    Location   Region   SaleType  AvgSales  AvgMonthlyPayment

问题是,在更新和进行加权平均时,波士顿的每笔交易都获得了 500 笔销售额。添加后,总销售额应为 1500,但现在为 2500。

如果我使用表 B 中的销售值更新表 A,则每个销售类型的销售都会重复 - 所以它会抛出最终的平均销售。

  update is this: (Added new column sales in A)

    update a
    set a.sales = b.sales
    from tableA a join tableB b on a.bankname=b.bankname and 
    a.location=b.location and a.region = b.region


    weighted average from A is calculated like this:

     select bankname,location,region,saletype, 
     sum(case when sales is not null then sales*weight else 0 
     end)/sum(weight) as avgsales
     , sum(case when monthlypayment is not null then monthlypayment*weight 
     else 0 end)/sum(weight) as avgmonthlyp
     from tableA
     group by bankname,location,region,saletype

对于每个销售类型,销售都会更新价值,从而将最终价值增加该倍。

如何更新销售额,使 BOA 仅获得 500,Mellon 仅获得 1000,总销售额为 1500?

标签: sqlsql-server

解决方案


推荐阅读