2017-01-05 5 views
0

У меня есть три таблицы клиента, сделки и взнос.
Я хочу, чтобы выбрать имени от клиентом таблицы и суммы полной стоимость от сделок таблицы и сумма суммы платежа от партии таблицы по каждому клиенту и в конце вычесть сумму общая сумма от суммы платежа сумма.
, поэтому результатом должен быть список, который содержит имя всех клиентов и их долг.как использовать группу, с внутренним соединением

Я пробую следующую команду, но она возвращает неправильные значения, похоже, они суммируются дважды или, возможно, больше.

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 

, потому что я думал, что сумма запроса общей цены для каждой записи рассрочки таблицы и просуммировать сумму платежа для каждой записи таблицы сделок я пытаюсь использовать выберите в внутренних соединениях, чтобы каждый из них отличаются, но это Безразлично» t work , поэтому я даже не мог вычесть результаты.
Я также попробовать следующий запрос

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 

, которые отображают и ошибки, которые говорят, запрос возвращается не более одной строки.
, когда я использую только один выбор из вышеприведенного запроса, результат в порядке, но когда я пытаюсь объединить его, он не работает.

ответ

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 
+0

спасибо, что он работает правильно, как мне нужно :) – AliDK

+0

Я просто хочу знать, какой из них лучше, вычтите результат этих двух внутренних соединений в sql, поэтому у меня будет две колонки как результат (имя клиента и долг), о котором я упоминаю, или когда я получаю результат запроса в php, а затем вычитаю их внутри цикла подряд за строкой. если первый выбор лучше, то как мне это сделать, потому что я новичок в sql, но могу сделать это в php – AliDK

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 

и как @ Тим Biegeleisen сказал, что если sql_mode вашей БД MySQL содержит ONLY_FULL_GROUP_BY , вы также должны добавить c.name в статье group by. и использовать этот запрос для проверки sql_mode:

show variables like 'sql_mode'; 
+0

Спасибо за исправление +1 –

0

Можете ли вы дать мне реальный снимок экрана каждого из таблицы с несколькими записями в них?

Вы, вероятно, получить повторяющиеся строки из-за этой линии: внутреннее соединение (выберите trade_type, сумму (PAYMENT_AMOUNT) в качестве PAYMENT_AMOUNT из рассрочка группы по C_ID)

в принципе, вы, вероятно, не следует использовать сумму (), а также выбор значений из любого другого поля. Вот почему: sum (payment_amount) должен вернуть 1 строку правильно? Но рядом с ним у вас есть «select trade_type», который, вероятно, собирается возвращать несколько строк.

Кроме того, на каком языке это? MySQL? SQL?

Смежные вопросы