如何使用group by with inner join

时间:2017-01-05 07:30:29

标签: mysql join group-by

我有三个表客户讨价还价分期付款
我想从客户表中选择名称,并从讨价还价表中选择总价的总和以及的总和根据每个客户,分期付款表中的付款金额,最后从付款金额中减去总价的总和。
所以结果应该是一个包含所有客户名称及其债务的清单。

我尝试以下命令,但它返回错误的值,看起来它们被加总两次或者更多。

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

表示查询返回多行的显示和错误。
当我只使用上述查询中的一个选择时,结果是正常的,但是当我尝试将其结合起来时无效。

4 个答案:

答案 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