Nano Hash - криптовалюты, майнинг, программирование

Расчет НДС/налога на итог в MySQL - со ставкой НДС в зависимости от поля местоположения

Я пытаюсь создать отчет в 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

Ответы:


1

Причина, по которой вы получаете только одну строку, заключается в том, что функция sum() делает этот запрос агрегацией. Но у вас нет group by. Я думаю, что группировка по postid исправляет это, наряду с некоторыми другими настройками select:

SELECT TRIM(LEADING 'Order –' FROM post_title) AS Date,
max(m1.meta_value) AS _order_number,
max(m2.meta_value) AS _Customer_Location,
max(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'

К такому типу данных довольно сложно привыкнуть. Все данные для одной записи разбиваются на несколько строк.

Чтобы изменить множитель в зависимости от местоположения, используйте предложение where. Вот пример:

SUM(case when location = 'UK' then 0 else m3.meta_value*20/120 end) AS _VAT,
SUM(case when location = 'UK' then m3.meta_value else m3.meta_value*100/120 end) AS _NET
22.05.2013
  • О, спасибо, Гордон - я добавил GROUP BY wp_posts.ID, и он разобрался с моей таблицей, так что она выглядит так, как я и ожидал, уф. Любые мысли о том, как я могу изменить множитель в зависимости от местоположения, или глупо ожидать этого в MySQL? 22.05.2013
  • Вы делаете дело ВНУТРИ СУММЫ! Конечно! По какой-то причине я пытался поместить SUM внутрь корпуса, но это не сработало. Еще раз спасибо за помощь, я вижу, что мне нужно больше практиковаться с кейсами. 22.05.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..