我有三个表客户,讨价还价和分期付款。
我想从客户表中选择名称,并从讨价还价表中选择总价的总和以及的总和根据每个客户,分期付款表中的付款金额,最后从付款金额中减去总价的总和。
所以结果应该是一个包含所有客户名称及其债务的清单。
我尝试以下命令,但它返回错误的值,看起来它们被加总两次或者更多。
select c.name, b.total_price, i.payment_amount
from customer as c
inner join (select sell_or_buy, sum(total_price) as total_price from bargains group by C_ID ) as b on (b.sell_or_buy = 'خرید')
inner join (select trade_type, sum(payment_amount) as payment_amount from installment group by C_ID ) as i on (i.trade_type = 'پرداخت')
group by c.C_ID
因为我认为查询总和分期付款表的每个记录的总价格并且为每个交易记录表的付款金额加起来我尝试使用内部联接中的select来使它们中的每一个都不同但它不起作用 所以我甚至无法减去结果 我也尝试以下查询
select
(select sum(payment_amount) as payment_amount from installment where trade_type = 'پرداخت'group by C_ID)-
(select sum(total_price) as total_price from bargains where sell_or_buy = 'خرید' group by C_ID)as result
表示查询返回多行的显示和错误。
当我只使用上述查询中的一个选择时,结果是正常的,但是当我尝试将其结合起来时无效。
答案 0 :(得分:1)
无需使用子查询来执行此操作,只需加入三个表并进行聚合,请尝试以下操作:
select
c.name,
sum(b.total_price) as total_price,
sum(i.payment_amount) as payment_amount
from customer as c
inner join bargains b on c.c_id = b.c_id and b.sell_or_buy = 'خرید'
inner join installment i on c.c_id = i.c_id and i.trade_type = 'پرداخت'
group by c.c_id -- ,c.name
和@Tim Biegeleisen一样,如果你的mysql数据库的sql_mode
包含ONLY_FULL_GROUP_BY
,你还应该在c.name
子句中添加group by
。
并使用此查询来检查sql_mode
:
show variables like 'sql_mode';
答案 1 :(得分:1)
您的原始查询似乎缺少正确的连接条件。试试这个:
select c.name,
b.total_price,
i.payment_amount
from customer as c
inner join
(
select C_ID, sum(total_price) as total_price
from bargains
where sell_or_buy = 'خرید'
group by C_ID
) as b
on c.C_ID = b.C_ID
inner join
(
select C_ID, sum(payment_amount) as payment_amount
from installment
where trade_type = 'پرداخت'
group by C_ID
) as i
on c.C_ID = i.C_ID
如果您想计算总价格和付款金额之间的差异,请使用此SELECT
:
select c.name,
b.total_price,
i.payment_amount,
b.total_price - i.payment_amount AS diff
答案 2 :(得分:0)
你能给我一张每张桌子的实际屏幕截图,里面有几个条目吗?
由于此行,您可能会获得重复的行: 内部联接(选择trade_type,sum(payment_amount)作为来自分期付款组的payment_amount C_ID)
基本上,您可能不应该使用sum()函数,同时还要从任何其他字段中选择值。这就是为什么:sum(payment_amount)应该返回1行正确吗?但就在它旁边你已经选择了trade_type"这可能会返回多行。另外,这是什么语言? MySQL的? SQL?
答案 3 :(得分:0)
子查询:
SELECT c.Id AS CustomerId, c.Name AS CustomerName, m.Name AS ManagerName, o.SumAmmount
FROM Customers AS c
INNER JOIN Managers AS m ON c.ManagerId = m.Id
INNER JOIN
(SELECT SUM(Amount) AS SumAmmount, o.CustomerId
FROM Orders AS o
WHERE Date >= '2017-01-01'
GROUP BY CustomerId
HAVING SUM(Amount) >= 10000) AS o ON c.Id = o.CustomerId
无子查询:
SELECT c.Id AS CustomerId, c.Name AS CustomerName,
m.Name AS ManagerName, SUM(o.Amount) AS SumAmmount
FROM Customers AS c
INNER JOIN Managers AS m ON c.ManagerId = m.Id
INNER JOIN Orders AS o ON c.Id = o.CustomerId
WHERE o.Date >= '2017-01-01'
GROUP BY c.Id, c.Name, m.Name
HAVING SUM(Amount) >= 10000