2015-04-24 3 views
0

У меня есть таблица mysql, содержащая services for invoices.Условные значения Sum в запросе mysql

это выглядит как

servicename|ammount|price|tag(type of service)|discount(service worthy of discount, true or false)|clientDiscount(client worthy of discount, true or false)

Мне нужно сделать запрос, groups by year, sums(amount * price)

Но, если discount и clientDiscount являются true мне нужно рассчитывать на discount of 15%

I попробовали с футляром и if statements, но ничего не работает. Я действительно не знаю, что конец ведьмы начнется. И, честно говоря, я не могу понять, как работают дела и если действуют утверждения. Я думаю, мне нужно сделать одну Sum, которая содержит услуги со скидкой true и скидкой клиента true, а затем еще одна сумма, которая включает в себя услуги без скидок и добавить эти upp, чтобы получить правильную сумму? Прямо сейчас, как муравейник в моей голове.

+0

Предоставьте некоторые данные образца и ожидаемый результат. –

ответ

0

Вы могли бы объединить его без if. discount и clientdiscount являются целыми числами, поэтому вы можете просто умножить их на процент скидок. Немного измененный сценарий @pala:

select year(invoicedate), sum(amount * price * (1 - discount * clientdiscount * 0.15)) total 
    from invoices 
    group by year(invoicedate); 
+0

Это работает. Но я не знаю почему? Можете ли вы объяснить – Jesper

+0

из-за ассоциативности, '1 - discount * clientdiscount * 0.15' становится' 1-0', если либо 'discount', либо' clientdiscount' равны 0. и '1 - 0.15', если они оба являются' 1'. –

+0

@ Jesper Это простая арифметика. Значение * (1 - 0,15) = Значение * 0,85. discount и clientdiscount могут быть равны 0 или 1. Если оба равны 1, вы должны применить скидку. Когда один (или оба) равны 0, вы не должны применять скидку. Итак, в первом случае вы получите значение * (1 - 1 * 1 * 0.15) = значение * 0,85. Во втором случае - значение * (1 - 0 * 0,15) = значение * 1 = значение. –

1

Вы хотите:

select year(invoicedate), sum(amount * price * if(discount and clientdiscount, 0.85, 1)) total 
    from invoices 
    group by year(invoicedate); 

demo here

if заявление как это работает. if(condition, value-if-true, value-if-false). Итак, в вашем примере, если верно discount and clientdiscount (то есть, они оба равны 1), он вернет вашу скидку 15% (скидка X такая же, как умножается на 1 - X). Если условие ложно, оно вернет 1, что не изменит результат amount * price. Таким образом, после того, как if обработана, sum становится либо:
sum(amount * price * 0.85) -- if discount and client discount are both 1
ИЛИ
sum(amount * price * 1) -- if discount and client discount are both 0

+0

Вероятно, вопрос с dum, но значения в моей скидке, столбцы clientDiscount являются true и false, а не 1 или 0. Его легко изменить. Но может ли он работать как с истинным или ложным значением? – Jesper

+0

Он должен работать нормально. –

+0

Я ЛЮБЛЮ ВАС !!!!!!! Я почти на месте. Ive сделал два поля «как итоговые» и «как totaldiscount», можно ли сделать сумму этих двух, таких как сумма (total-totaldiscount), как окончательная? Вот ссылка на то, где я сейчас. http://sqlfiddle.com/#!9/ee57c/2/0 Я получаю сообщение о том, что теперь есть всего. – Jesper

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