mysql - 在 MySQL 中计算总额的增值税/税 - 增值税税率取决于位置字段

标签 mysql wordpress woocommerce

我正在尝试在 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'

这给了我一张这样的 table :

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) 显然,这仅在税率发生变化之前有效。我处理这个问题的最佳选择是仅在下一次修改税率时按日期限制此报告,并为适用新税率的 future 订单制作新报告吗?或者有更聪明的方法吗?

我明白向客户收取统一费率并支付可变税是一种有点奇怪的方法,但我不会改变这一点,我只是负责提供报告。 :-(

编辑 感谢 Gordon,我已经解决了我的 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

我已经制定了一个部分解决方案 - 我使用 CASE 代替 SUM 行来为我提供增值税的计算值。

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    

不幸的是,我不能只针对 _NET 值(价格 - 增值税,因为它与增值税是相同的 CASE,因此会产生错误)重复 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

最佳答案

你只得到一行的原因是 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

关于mysql - 在 MySQL 中计算总额的增值税/税 - 增值税税率取决于位置字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680486/

相关文章:

php - Slim-3.x 中缺少 Slim.php

mysql - 使用 SQL GROUP BY 时合并

mysql - 编辑数据库中的最新行?

wordpress - 错误: Minified React error #321 on Wordpress custom block plugin

php - 查询日期数组以仅显示 future 事件 - PHP

css - 更改位置 Product_Tittle Woocommerce

使用 WHERE IN 和 JOINS 更新 Mysql

php - 如何合并 WooCommerce 中的“描述”和“附加信息”选项卡?

javascript - 有没有办法根据链接自动填充表单字段?

php - WORDPRESS UPDATE DB 方法未被调用