Я пытаюсь создать отчет в MySQL (из таблиц в установке Wordpress/Woocommerce, но способ налогообложения этого магазина отличается от того, как работает Woocommerce, поэтому я не могу использовать отчеты Woocommerce.)
При расчете необходимо определить налоговую ставку в размере 20% (НДС Великобритании) от общей суммы, но только в том случае, если клиент находится в определенном месте. Итак, если клиент находится в «мире», ставка налога составляет 0%. Если клиент находится в Великобритании, ставка налога составляет 20%. Но общая сумма остается прежней (таким образом, экспорт приносит больше прибыли, чем местные продажи!)
Я начал с:
SELECT TRIM(LEADING 'Order –' FROM post_title) AS Date,
m1.meta_value AS _order_number,
m2.meta_value AS _Location,
m3.meta_value AS _order_total
FROM wp_posts
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = '_order_number'
LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_shipping_method_title'
LEFT JOIN wp_postmeta AS m3 ON m3.post_id = wp_posts.ID AND m3.meta_key = '_order_total'
WHERE wp_posts.post_type = 'shop_order'
Это дало мне такую таблицу:
Date | Order no | Location | Order Total
May 2013 | 123 |World |1124.00
Jan 2013 | 124 |UK |163.00
Все идет нормально. Затем я попытался добавить несколько СУММ, чтобы вычислить сумму НДС.
SELECT TRIM(LEADING 'Order –' FROM post_title) AS Date,
m1.meta_value AS _order_number,
m2.meta_value AS _Location,
m3.meta_value AS _order_total,
SUM(m3.meta_value*20/120) AS _VAT,
SUM(m3.meta_value*100/120) AS _NET
FROM wp_posts
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = '_order_number'
LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_shipping_method_title'
LEFT JOIN wp_postmeta AS m3 ON m3.post_id = wp_posts.ID AND m3.meta_key = '_order_total'
WHERE wp_posts.post_type = 'shop_order'
Я думал, что это даст мне:
Date | Order no | Location | Order Total | VAT | NET
May 2013 | 123| World | 1124.00 | 187.33 | 1311.33
Jan 2013 | 124 | UK | 163.00 | 27.17 | 190.17
И тогда я мог бы попытаться выяснить, как изменить скорость в зависимости от местоположения. К сожалению, кажется, что все суммируется, а не дает мне результаты построчно.
1) что я напортачил, что суммирует все вместе?
2) какие-либо идеи о том, как лучше всего применять расчет НДС, только когда _shipping_method_title=UK?
3) Понятно, что это работает только до изменения налоговых ставок. Является ли мой лучший выбор для решения этой проблемы, чтобы просто ограничить этот отчет датой в тот момент, когда налоговая ставка будет изменена в следующий раз, и сделать новый отчет для будущих заказов, к которым применяются новые налоговые ставки? Или есть более хитрый способ?
Я понимаю, что взимание фиксированной ставки с клиента и уплата переменного налога - это немного странный подход, но я не могу это изменить, мне просто поручено предоставить отчет. :-(
РЕДАКТИРОВАТЬ Благодаря Гордону я разобрался со своей проблемой SUM, и теперь мой запрос выглядит следующим образом и выдает ожидаемый макет таблицы, как показано выше:
SELECT TRIM(LEADING 'Order –' FROM post_title) AS Date,
m1.meta_value AS _order_number,
m2.meta_value AS _Location,
m3.meta_value AS _order_total,
SUM(m3.meta_value*20/120) AS _VAT,
SUM(m3.meta_value*100/120) AS _NET
FROM wp_posts
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = '_order_number'
LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_shipping_method_title'
LEFT JOIN wp_postmeta AS m3 ON m3.post_id = wp_posts.ID AND m3.meta_key = '_order_total'
WHERE wp_posts.post_type = 'shop_order'
GROUP BY wp_posts.ID
Но я все еще не уверен, как изменить множители на основе значения в поле местоположения. Это возможно, или я лаю не по тому дереву?
ИЗМЕНИТЬ 2
Я разработал частичное решение - вместо строк SUM я использовал CASE, чтобы получить расчетное значение НДС.
CASE
when m2.meta_value = 'World Delivery' then 0
when m2.meta_value = 'UK Delivery' then (m3.meta_value*20/120)
when m2.meta_value = 'European Delivery' then (m3.meta_value*20/120)
END AS _VAT
К сожалению, я не могу просто повторить оператор CASE для значения _NET (цена - НДС, так как это тот же CASE, что и НДС, поэтому возникает ошибка.
Я хочу сделать что-то вроде
SUM(_order_total-_VAT) AS _NET
Но *_order_total* и *_VAT* не распознаются как столбцы, по которым можно производить расчеты.
ПОСЛЕДНЯЯ РЕДАКТИРОВАНИЕ Еще раз спасибо Гордону, мой окончательный запрос выглядит так, я просто добавляю его на случай, если кто-то еще сочтет его полезным. Этот запрос работает с плагином Wordpress Exports and Reports Wordpress, поэтому его можно быстро интегрировать в панель администрирования Wordpress и экспортировать в Excel, что очень удобно.
SELECT TRIM(LEADING 'Order –' FROM post_title) AS Date,
m1.meta_value AS _order_number,
m2.meta_value AS _Customer_Location,
m3.meta_value AS _order_total,
ROUND(SUM(case when m2.meta_value = 'World Delivery' then 0 else m3.meta_value*20/120 end),2) AS _VAT,
ROUND(SUM(case when m2.meta_value = 'World Delivery' then m3.meta_value else m3.meta_value*100/120 end),2) AS _NET
FROM wp_posts
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = '_order_number'
LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_shipping_method_title'
LEFT JOIN wp_postmeta AS m3 ON m3.post_id = wp_posts.ID AND m3.meta_key = '_order_total'
WHERE wp_posts.post_type = 'shop_order' AND wp_comments.comment_post_id = wp_posts.ID AND wp_comments.comment_content="Order status changed from processing to completed."
GROUP BY wp_posts.ID