【问题标题】:SQL update statement to sum column in one table, then add the total to a different column/tableSQL 更新语句对一个表中的列求和,然后将总计添加到不同的列/表
【发布时间】:2021-06-25 22:12:24
【问题描述】:

晚上好,如果可能的话,希望有一些关于 SQL Server 查询的指针。

我在一个数据库中有两张表,示例如下:

PostedTran 
PostedTranID    AccountID   PeriodID    Value   TransactionDate 
1               100         120         100     2019-01-01
2               100         120         200     2020-01-01
3               100         130         300     2021-01-01
4               101         120         400     2020-01-01
5               101         130         500     2021-01-01

PeriodValue
PeriodValueID   AccountID   PeriodID    ActualValue
10              100         120         500
11              101         120         600 

我的两张表不匹配,我的尝试失败得很惨。从 PostedTran 表中,我尝试选择 2021-01-01 之前的所有交易行,然后从结果中对每个 AccountID 的值求和。然后我需要将该值添加到 PeriodValue 表中现有的 ActualValue 中。

因此,在上面的示例中,PeriodValueID 10 上的 ActualValue 将更新为 800,而 11 将更新为 1000。此示例中的 PeriodID 是恒定的,并且始终为 120。

提前感谢您的帮助。

【问题讨论】:

  • 你的关系型数据库是什么?
  • 嗯,我觉得很可疑...PeriodValue.ActualValue 不是要保存PostedTran.Value 的总和吗?如果是这样删除列PeriodValue.ActualValue 或实际上是整个表PeriodValue。他们所做的只是存储冗余数据,这是一件坏事,因为它可能导致不一致。如果需要,请查询总和。为方便起见,您可以创建一个执行此操作的视图。

标签: sql join select sum


【解决方案1】:

由于没有提到 RDMS,pseudo-sql 看起来像:

with DataSum as
(
select AccountID, PeriodID, sum(Value) as TotalValue
from PostedTran 
where TransactionDate<'1/1/2021'
group by AccountID, PeriodID
)
update PeriodValue set ActualValue = ActualValue + ds.TotalVaue
from PeriodValue pv inner join DataSum ds
on pv.accountid=ds.accountid and pv.periodid=ds.periodid 

【讨论】:

    【解决方案2】:

    以下内容应该满足您的要求。我没有在关联中包含PeriodId,因为您没有在说明中指定它,但是如果需要,您可以只包含它。

    update pv set pv.ActualValue=pv.ActualValue + t.Value
    from PeriodValue pv
    cross apply (
        select Sum(value) value
        from PostedTran pt
        where pt.AccountId=pv.AccountId and pt.TransactionDate <'20210101'
    )t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多