【问题标题】:Update column in Invoice Table with Payment total from Payments table使用付款表中的付款总额更新发票表中的列
【发布时间】:2021-12-28 21:57:22
【问题描述】:

我有 2 张桌子(如下所示) - InvoicePayments。一张发票可以有多次付款。我需要从PaymentsSUMPayAmt 的总数,并更新Invoice 表中的PayTotal 列。

这不起作用:

UPDATE Invoices
SET Invoices.PayTotal = Payments.Total
FROM Invoices 
INNER JOIN 
    (SELECT InvNum_FK, SUM(PayAmt) as Total
     FROM Payments) ON Invoices.InvNum_PK = Payments.InvNum_FK
CREATE TABLE dbo.Invoices
(
    InvNum_PK nvarchar(255) PRIMARY KEY,
    InvAmt    money,
    InvDate   date,
    CustName  nvarchar(255),
    PayTotal  money,
    PayCount  int
);

CREATE TABLE dbo.Payments
(
    PayNum_PK int PRIMARY KEY,
    InvNum_FK nvarchar(255) 
        FOREIGN KEY REFERENCES dbo.Invoices(InvNum_PK),
    PayAmt    money,
    PayDate   date,
);

INSERT INTO Invoices 
VALUES ('GLI101', 838.93, '2021-08-01', 'George Washington', 0, 0);
INSERT INTO Invoices 
VALUES ('GLI202', 1280.26, '2021-08-02', 'Abe Lincoln', 0, 0);
INSERT INTO Invoices 
VALUES ('GLI303', 1456.23, '2021-08-03', 'Tom Jefferson', 0, 0);
INSERT INTO Invoices 
VALUES ('GLI404', 1124.97, '2021-08-04', 'Jim Madison', 0, 0);

INSERT INTO Payments VALUES (1, 'GLI101', 223.33, '08/15/2021')
INSERT INTO Payments VALUES (2, 'GLI101', 211.88, '09/16/2021')
INSERT INTO Payments VALUES (3, 'GLI101', 316.44, '09/14/2021')
INSERT INTO Payments VALUES (4, 'GLI404', 415.46, '09/10/2021')
INSERT INTO Payments VALUES (5, 'GLI404', 115.46, '09/04/2021')

【问题讨论】:

  • 停下来,只是不要。数据应保持无冗余以避免出现不一致的可能性。因此,将一张表上的总和写入另一张表并不是一件好事。如果您需要总和,您可以随时查询并获得 正确 结果。为方便起见,您可以创建一个视图来存储此类查询,这样您就不必每次都重复它。
  • 不要从不从不发布表格图片。将CREATEINSERT 语句发布为文本
  • 我正在使用不会创建计算字段值的前端 (CRUD),因此我需要获取计算值并更新数据库中的列。我在这个板上发现了许多帖子,其中有问题和答案都在做同样的事情,但我无法工作。
  • 那么,如果工具不够用,不如更改访问数据库的工具,而不是对数据库进行非规范化...
  • 在一个完美的世界里,我会这样做。幸运的是,我能够从人们“非规范化”(不确定这是否真的是一个词)他们的数据库发布的许多其他解决方案中拼凑出我自己的答案,就像我自己做得很好。

标签: sql join sum sql-update


【解决方案1】:

如果将来有人带着同样的问题查看这篇文章,这将有效:


WITH cte AS (
    SELECT InvNum_FK, SUM(PayAmt) AS PayTotal
    FROM Payments
    GROUP BY InvNum_FK)
UPDATE Invoices SET Invoices.PayTotal = cte.PayTotal
FROM Invoices INNER JOIN cte ON Invoices.InvNum_PK = cte.InvNum_FK

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2015-10-09
    • 2017-07-28
    • 1970-01-01
    • 2016-09-30
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多