sql如何把供应商应付,已付,到期应付写在一个表内(注意,目前数据库只有应付表,已付表,两个表)?

sql如何把供应商应付款,已付款,到期应付款写在一个表内(注意,目前数据库只有应付表,已付表,没有到期应付这个表,那么这个值要经过以上已知的两个表计算得出:
到期应付: 应付表内 同一张应付单,供应商记账日期+账期=>当前日期 这个供应商每张单的金额之和-已付表内这个供应商每张单的金额之和)

第1个回答  2023-03-06
可以通过 SQL 的联合查询和子查询来实现把供应商应付款、已付款、到期应付款写在一个表内。
首先,我们需要使用子查询来计算到期应付款。根据题目描述,我们需要对每个供应商的每张应付单进行计算,因此需要先按照供应商和应付单号进行分组,然后计算每个供应商的每张应付单的到期应付款。具体 SQL 语句如下:
SELECT ap.supplier_id, ap.invoice_no,
SUM(ap.invoice_amt - COALESCE(p.paid_amt, 0)) AS due_amt
FROM accounts_payable AS ap
LEFT JOIN (
SELECT supplier_id, invoice_no, SUM(paid_amt) AS paid_amt
FROM accounts_paid
GROUP BY supplier_id, invoice_no
) AS p ON ap.supplier_id = p.supplier_id AND ap.invoice_no = p.invoice_no
WHERE ap.invoice_date + ap.term_days <= NOW()
GROUP BY ap.supplier_id, ap.invoice_no
上述 SQL 语句中,我们先进行了一个左连接,将应付表(accounts_payable)和已付表(accounts_paid)连接起来,这样每个应付单就能够计算已付款了。然后,我们在 WHERE 子句中使用应付表中的供应商记账日期和账期计算出到期日期,再和当前日期比较,如果到期了就进行计算。最后,我们按照供应商和应付单号进行分组,计算每个应付单的到期应付款。
接下来,我们需要将计算出的应付款、已付款和到期应付款合并到一起。我们可以使用联合查询来实现。具体 SQL 语句如下:
SELECT supplier_id, 'Accounts Payable' AS type,
invoice_no, invoice_amt AS amt
FROM accounts_payable
UNION ALL
SELECT supplier_id, 'Accounts Paid' AS type,
invoice_no, paid_amt AS amt
FROM accounts_paid
UNION ALL
SELECT supplier_id, 'Due Accounts Payable' AS type,
invoice_no, due_amt AS amt
FROM (
SELECT ap.supplier_id, ap.invoice_no,
SUM(ap.invoice_amt - COALESCE(p.paid_amt, 0)) AS due_amt
FROM accounts_payable AS ap
LEFT JOIN (
SELECT supplier_id, invoice_no, SUM(paid_amt) AS paid_amt
FROM accounts_paid
GROUP BY supplier_id, invoice_no
) AS p ON ap.supplier_id = p.supplier_id AND ap.invoice_no = p.invoice_no
WHERE ap.invoice_date + ap.term_days <= NOW()
GROUP BY ap.supplier_id, ap.invoice_no
) AS d
ORDER BY supplier_id, type, invoice_no
上述 SQL 语句中,我们使用了三个 SELECT 语句,分别查询应付表、已付表和计算出的到期应付款表。为了将这三个表合并,我们使用了 UNION ALL 进行联合查询。在每个 SELECT 语句中,我们都添加了一个 type 字段,用于表示当前记录是应付款、已付款还是到期应付款。
使用以下 SQL 语句将供应商应付款、已付款和到期应付款写在一个表内:
SELECT a.供应商名称, SUM(a.应付金额) AS 应付款, SUM(b.已付金额) AS 已付款,
(SUM(a.应付金额) - SUM(b.已付金额)) AS 到期应付款
FROM 应付表 a
LEFT JOIN 已付表 b ON a.应付单号 = b.应付单号 AND a.供应商名称 = b.供应商名称
WHERE a.供应商名称 = '供应商A' -- 可以根据需要指定供应商
GROUP BY a.供应商名称;
这里使用了左连接(LEFT JOIN)将应付表和已付表关联起来,然后按照供应商名称分组,计算应付款、已付款和到期应付款。其中,应付款通过 SUM(a.应付金额) 计算,已付款通过 SUM(b.已付金额) 计算,到期应付款通过 (SUM(a.应付金额) - SUM(b.已付金额)) 计算。可以根据需要指定具体的供应商名称。
相似回答
大家正在搜