从两个表中求和,然后用2个和来执行操作

时间:2015-06-17 11:49:36

标签: sql-server insert sum sql-update

我正在使用sql server,我有一个名为accnt的表,其中包含ven1和amnt1字段以及一个名为acc1167的表,其中包含字段ven,job#和amnt。对于此示例,这些表看起来像这样

   accnt                          acc1167
ven1     amnt1              ven     job#   amnt
1167     100                1167     1      200     
1152     50                 1167     2      300
1167     110                1167     3      100
1167     300                1167     4      200
1252     1050               1167     5      200
1167     210                1167     6      150
1167     1150 
1167     130 
2113     800 
1167     550
1167     1200

我需要根据1167的ven1对所有记录加上amnt1,我们称之为sumA。然后在acc1167中对所有记录求和,我们将调用此sumB。接下来我需要将sumB除以sumA来得到一个比率。最后我需要将acc1167中的每个amnt值乘以比率,得到一个数字,然后替换acc1167 amnt值。

例如,sumA = 3750,sumB = 1150.取这些值,sumB / sumA = 0.307。然后我将acc1167 amnt中的每个值替换为0.307 *本身,因此最终表应该如下所示:

      acc1167
ven   job#    amnt
1167   1      61.4
1167   2      92.1
1167   3      30.7
1167   4      61.4
1167   5      61.4
1167   6      46.05

我曾尝试使用sum函数和一些插入,但我对SQL很新,以前从未使用过sum,也不知道如何从多个表调用,或者如何存储比率。我试过这个:

UPDATE     acc1167
sum1 = sum amnt1 where ven1 = '1167'
from accnt
sum2 = sum amnt
from accnt
SET        amnt = sum2/sum1*amnt
FROM       acc1167

2 个答案:

答案 0 :(得分:0)

嗯,你可以非常简单地完成它,绝对是根据你的任务描述:

declare @sumA decimal(29, 10), @sumB decimal(29, 10), @ratio decimal(29, 10)

select @sumA = sum(amnt1) from accnt where ven1 = 1167
select @sumB = sum(amnt) from acc1167
select @ratio = @sumB / @sumA

update acc1167 set amnt = amnt * @ratio

答案 1 :(得分:0)

尝试以下方法:

DECLARE @accnt TABLE ( ven1 INT, amnt1 MONEY )
DECLARE @acc1167 TABLE
    (
      ven INT ,
      job INT ,
      amnt MONEY
    )

INSERT  INTO @accnt
VALUES  ( 1167, 100 ),
        ( 1152, 50 ),
        ( 1167, 110 ),
        ( 1167, 300 ),
        ( 1252, 1050 ),
        ( 1167, 210 ),
        ( 1167, 1150 ),
        ( 1167, 130 ),
        ( 2113, 800 ),
        ( 1167, 550 ),
        ( 1167, 1200 )

INSERT  INTO @acc1167
VALUES  ( 1167, 1, 200 ),
        ( 1167, 2, 300 ),
        ( 1167, 3, 100 ),
        ( 1167, 4, 200 ),
        ( 1167, 5, 200 ),
        ( 1167, 6, 150 )

;WITH cte AS(SELECT *, amnt * SUM(amnt) OVER() / 
                       (SELECT SUM(amnt1) FROM @accnt WHERE ven1 = 1167 ) namnt 
             FROM @acc1167)
UPDATE cte SET amnt = namnt

SELECT * FROM @acc1167

输出:

ven     job amnt
1167    1   61.3333
1167    2   92.00
1167    3   30.6666
1167    4   61.3333
1167    5   61.3333
1167    6   46.00