我试图在MySQL中创建报告(从Wordpress/Woocommerce安装中的表格中,但该店的税收方式不同以Woocommerce的方式做事,所以我不能使用Woocommerce报告。)在MySQL中计算增值税/税总额 - 增值税率取决于位置字段
计算需要从总数中计算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
到现在为止还挺好。所以然后我尝试添加一些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'
我认为这会给我:
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
但我仍然不知道如何基于位置字段中的值更改乘数。这是可能的,还是我在这里找错了树?
EDIT 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价值(价格 - 增值税,因为它是相同的情况下,增值税,所以创建了一个错误。
我要像做
SUM(_order_total-_VAT) AS _NET
但* _order_total *和* _VAT *不被识别为可以计算出列。
最后编辑再次 感谢戈登,我的最终查询看起来是这样的,我只是将它添加的情况下,别人可能会觉得它有用。此查询适用于Wordpress导出和报告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
噢,谢谢Gordon - 我添加了GROUP BY wp_posts.ID,它已经整理了我的表,所以它看起来和我的预期一样,唷。 关于如何改变依赖于位置的乘数的任何想法,还是期望在MySQL中这样做是愚蠢的? – Victoria
你这样做的内部总结!当然!出于某种原因,我试图把SUM放在案件中 - 这是行不通的。再次感谢你的帮助,我可以看到我需要更多的案例练习。 – Victoria