2013-05-21 96 views
1

我试图在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 

回答

2

您只得到一行的原因是因为sum()函数使得这是一个聚合查询。但是,你没有group by。我认为,由分组帖子ID修复,与其他一些调整一起到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 
+0

噢,谢谢Gordon - 我添加了GROUP BY wp_posts.ID,它已经整理了我的表,所以它看起来和我的预期一样,唷。 关于如何改变依赖于位置的乘数的任何想法,还是期望在MySQL中这样做是愚蠢的? – Victoria

+0

你这样做的内部总结!当然!出于某种原因,我试图把SUM放在案件中 - 这是行不通的。再次感谢你的帮助,我可以看到我需要更多的案例练习。 – Victoria