查询从3个表中获取数据,主表和sum列相互2个表

Query to get data from 3 tables, main tables and sum column from each other 2 tables

我正在努力查询从 3 tables 获取数据:

供应商:

supp_id     int
name        nvarchar(200)
phone       nvarchar(10)
location    nvarchar(50)
note        nvarchar(MAX)
date        date

suppliers_invoices:

ID          int 
supp_id     int 
o_number    nvarchar(50)
price       decimal(18, 2)
note        nvarchar(MAX)
date        date
image       image

suppliers_payments:

ID        int
supp_id   int
value     decimal(18, 2)
method    nvarchar(30)
note      nvarchar(MAX)
date      date

我想得到的是这个信息:

suppliers.supp_id,suppliers.name,suppliers.phone,(sum(suppliers_invoices.price),
(sum(suppliers_payments.value), ((sum(suppliers_invoices.price) - (sum(suppliers_payments.value))
group by suppliers.supp_id.

我想获得每个供应商的发票价格总额和已付价值总额。

我现在得到的是错误的数据,因为我认为价格乘以其他 table 行计数。

这是我试过的:

SELECT dbo.suppliers.supp_id, dbo.suppliers.name, dbo.suppliers.phone, 
SUM(dbo.suppliers_invoices.price) AS Expr1, SUM(dbo.suppliers_payments.value) AS Expr2
FROM dbo.suppliers INNER JOIN dbo.suppliers_invoices ON dbo.suppliers.supp_id = 
dbo.suppliers_invoices.supp_id INNER JOIN dbo.suppliers_payments ON dbo.suppliers.supp_id = 
dbo.suppliers_payments.supp_id GROUP BY dbo.suppliers.supp_id, dbo.suppliers.name,dbo.suppliers.phone

这是我正在测试的一些数据:

供应商:

supp_id   name    phone         location    note    date
1         test    0543642256    NULL        NULL    2020-11-17
2         test2   0543642211    NULL        NULL    2020-11-17

suppliers_invoices:

ID  supp_id   o_number   price      note    date         image     
1   1         123        5000.00    NULL    2020-11-17   NULL
2   1         1235       3000.00    NULL    2020-11-17   NULL
3   2         55         2000.00    NULL    2020-11-17   NULL

suppliers_payments:

ID  supp_id   value     method    note   date   
1   1         2000.00   cash      NULL   2020-11-17
2   1         2000.00   visa      NULL   2020-11-17

我想得到的是:

supp_id   name    phone         price       value   remain
1         test    0543642256    8000        4000    4000
2         test2   0543642211    2000        0       2000      

谢谢。

您需要在子查询中进行预聚合。一种选择使用横向连接:

select s.*, si.price, sp.value, si.price - sp.value as remain
from suppliers s
cross apply (
    select coalesce(sum(si.price), 0) as price
    from suppliers_invoices si
    where si.supp_id = s.supp_id
) si
cross apply (
    select coalesce(sum(sp.value), 0) as value
    from suppliers_payments sp
    where sp.supp_id = s.supp_id
) sp

您需要分别对价格和价值求和,然后与它们进行互动。不要因为事先尝试进行复杂的求和和连接而自杀;如果你加入错误,你会得到错误的计算。

SELECT 
  s.name,
  s.phone,
  inv.sumPrice,
  val.sumValue,
  isnull(inv.sumPrice, 0) - isnull(val.sumValue, 0) as sumProfit
FROM suppliers s
LEFT JOIN ( /* see this subquery, pretending to be a table */
           SELECT 
             supp_id,
             sum(price) as sumPrice
           FROM suppliers_invoices
           GROUP BY supp_id) inv on s.supp_id = inv.supp_id
LEFT JOIN ( /* see this subquery, pretending to be a table */
           SELECT 
             supp_id,
             sum([value]) as sumValue
           FROM suppliers_payments
           GROUP BY supp_id) val on s.supp_id = val.supp_id ;

Demo here

我认为您错过了左联接而不是内联接。

请查找以下查询:

SELECT sup.name, sum(sup_inv.price), sum(sup_pay.value), sup.supp_id
FROM suppliers sup
left JOIN suppliers_invoices sup_inv
 ON sup.supp_id = sup_inv.supp_id 
left JOIN suppliers_payments sup_pay
ON sup.supp_id = sup_pay.supp_id 
group by sup.supp_id, sup.name;