我正在使用 Firebird 3。我的合同賣家有“賣家”主表,商品收入檔案有詳細的“Doc”表,付款有子明細表“paym”。
賣家:Seller_id、賣家
檔案:doc_id、doc_summa、part_id
Paym:paid_id、doc_id、paid
賣方:
| 賣家編號 | 賣方 |
|---|---|
| 8個 | 公司1 |
| 45 | 公司2 |
檔案:
| 檔案編號 | 檔案摘要 | 賣家編號 |
|---|---|---|
| 346 | 1000 | 8個 |
| 347 | 600 | 45 |
| 348 | 800 | 45 |
付款方式:
| paym_id | 檔案編號 | 有薪酬的 |
|---|---|---|
| 1個 | 346 | 100 |
| 2個 | 346 | 100 |
| 3個 | 347 | 200 |
| 4個 | 348 | 100 |
| 5個 | 348 | 50 |
我的目標是像這樣獲得我的剩余債務(收入支付):
| 賣家編號 | 摘要 | 有薪酬的 | 債務 |
|---|---|---|---|
| 8個 | 1000 | 200 | 800 |
| 45 | 1400 | 350 | 1050 |
但是得到這個相乘的錯誤總結:
| 賣家編號 | 摘要 | 有薪酬的 | 債務 |
|---|---|---|---|
| 8個 | 2000 | 200 | 800 |
| 45 | 2200 | 350 | 1850年 |
SELECT
s.seller_id,
sum(d.doc_summa) as summa,
sum(p.paid) as paid,
sum(d.doc_summa)-sum(p.paid) as debt
FROM seller s Left Join Docs d on s.seller_id=d.seller_id
Left Join paym p on p.doc_id= d.doc_id
GROUP BY s.seller_id
我的 SQL 代碼有什么問題?
uj5u.com熱心網友回復:
您查詢的問題是,因為 doc_ids 346 和 348 有多次付款,所以您將有兩行的 doc_summa 分別為 1000 和 800,當您將它們相加時,seller_id 8 的總數變為 2000,seller_id 45 的總數變為 2200 .
要解決這個問題,您需要在加入檔案之前合并(求和)付款。例如像下面這樣:
with consolidated_paym as (
select
doc_id,
sum(paid) as total_paid
from paym
group by doc_id
)
select
s.seller_id,
sum(d.doc_summa) as summa,
sum(p.total_paid) as paid,
sum(d.doc_summa - p.total_paid) as debt
from seller s
left join docs d
on d.seller_id = s.seller_id
left join consolidated_paym as p
on p.doc_id = d.doc_id
group by s.seller_id
小提琴:https ://dbfiddle.uk/6_vyCu0w
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536656.html
標籤:数据库火鸟
上一篇:SparkSQL2.0查詢統計過去一小時內每15分鐘的請求數
下一篇:JOIN子句SQL
