2014-01-13 7 views
0

у меня есть две основные таблицы счетов и billing_items:MySQL отчетливый сумма без подзапросов

bills 
_______ 
id 
.. 
amount 
balance 

billing_items 
______________ 
id 
... 
bill_id 

Мне нужно, чтобы получить сумму от суммы счета и баланс на основе определенных критериев, указанных в таблице billing_items (ссылки стол и другие таблицы интерес)

, когда я использую ниже запрос я получаю дубликаты:

select sum(b.amount), sum(b.balance) 
from bills b left join billing_items bi 
on b.id=bi.bill_id; 

Я не могу использовать подзапросы, такие, как один ниже из-за ОРМ я использую (подзапросы не поддерживается):

select sum(a) from 
(select b.amount as a, b.balance 
    from bills b left join billing_items bi 
    on b.id=bi.bill_id group by b.id) t; 

критерии по billing_items и его ссылающиеся таблицы опущены, но мне нужно ссылаться billing_items

+1

Рассмотрите возможность предоставления надлежащих DDL и/или sqlfiddle ВМЕСТЕ С УДАЛЕННЫМ РЕЗУЛЬТАТОМ – Strawberry

+0

Итак, что не так с первым запросом? Можете ли вы объяснить, что такое «определенные критерии» (поскольку в вашем запросе нет фильтров). Я думаю, что это действительно помогло бы, если бы вы могли просто объяснить, что вы хотите, чтобы результат был похож. –

+0

Я буду внутренним соединением billing_items с тремя другими таблицами (visitprocedure -> visit -> referrer -> компания) Мне нужно отфильтровать company.id – user979051

ответ

1

не уверен, если ваш ORM позволяет использовать пользовательские переменные или нет в вашем SQL, если да, то вы могли бы попробовать это, в основном это ORDER BY bi.bill_id и только сумма сумма, когда есть новый bill_id

select sum(IF (@prevBillId IS NULL OR @prevBillId != bi.bill_id,b.amount,0)) as sumAmount, 
     sum(IF (@prevBillId IS NULL OR @prevBillId != bi.bill_id,b.balance,0)) as sumBalance, 
     @prevBillId:=bi.bill_id 
from bills b left join billing_items bi 
on b.id=bi.bill_id 
ORDER BY bi.bill_id; 

посмотреть sqlFiddle

+0

ORM не это, но это отличное решение. К сожалению, я не могу использовать его – user979051

+0

ли ваш ORM позволяет использовать NOT EXIST (SELECT from sometable WHERE somecolumn = somevalue)? –

0

Надеется, что это будет работать ...

Так что ваш вопрос левые присоединиться к billing_items выдает несколько строк за элемент выставления счетов, а ваша сумма (b.amount) умножается на количество строк, которые у вас есть. Итак, решение ... разделите сумму на ваш счет.

select b.id,sum(b.amount)/count(*) as amount, sum(b.balance) 
from bills b left join billing_items bi 
on b.id=bi.bill_id; 
group by b.id 

Дайте ему попробовать ... надеясь, что это сработает.

+0

Мне нравится идея, но она не может работать. Сумма каждого счета добавляется снова для каждого пункта выставления счета в каждом конкретном счете – user979051

+0

сумма, которую вы суммируете, указана в таблице счетов? Когда вы присоединяетесь к billing_items, сумма счета просто повторяется для каждого объекта выставления счета (или каждой строки). Не уверен, понимаю ли я, почему он не может работать. Если 10'000 повторяется за раз, оно суммируется до 40000, а деление на 4 возвращается к желаемому 10 000 номеров. Возможно, я не понимаю, что вы суммируете здесь – Twelfth

+0

((100 + 100 + 100)/3)) + ((200 + 200 + 200 + 200)/4)! = 1100/7 – user979051

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