查询从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 ;
我认为您错过了左联接而不是内联接。
请查找以下查询:
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;
我正在努力查询从 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 ;
我认为您错过了左联接而不是内联接。
请查找以下查询:
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;