看到这个标题可能大家不太懂是什么意思。就先在这里把场景进行还原下。最近做的是增值税的项目,增值税是进项纳税种类可以抵扣部分销项纳税种类,但是抵扣规则是随时变化的所以抵扣关系我通过另一张表进行维护。本来是想通过润乾报表进行设计的,但是由于抵扣规则是变化的,润乾报表没办法实现这个业务功能。于是还了种思路,既然润乾报表不 能计算,那么我就给你计算好,你只需要负责显示就OK了。
首先,抵扣的话就要分别将销项纳税种类和进项纳税种类分组进项查询出来。
如下代码:
select category,sum(TOTALPRICE) sum_price from tax_info_outitem group by category) a, --销项明细按纳税种类算出该类的金额总和 转化为a表
(select category,sum(TOTALPRICE) sum_price from tax_info_initem group by category) b,--进项明细按纳税种类算出该类的金额总和 转化为b表
查询完成后,接着就要查询对应的纳税种类之间的抵扣关系了。因为业务需求,销项纳税种类对应进项的抵扣是一对多的关系,所以这样查询出来的进项字段是多个编号用逗号隔开,对应一个销项纳税种类的 如图:
这样直接用in的话,会查询出来为空,因为不能讲'1,2,3,4'这样的形式直接和'1','2'这样的形式转化。所以这样就可以通过我最开始整理的转化方式进行转化然后再使用in进行纳税种类的筛选 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题
这样就转化完了,依次类推。下面将之前的结果转化为新表,进行按类型之间的销项金额,减去进项的总和。因为销项列不需要相加求和,但是进项列需要相加求和最终抵扣。所以按纳税种类和销项的金额为组进行分组查询即可。如下图:
最终代码如下:
select category,sum_price as 销项税额,sum(price) as 进项税额,sum_price-sum(price) as 应纳增值税额 from
(select a.category,a.sum_price,b.sum_price as price
from
(select category,sum(TOTALPRICE) sum_price from tax_info_outitem group by category) a, --销项明细按纳税种类算出该类的金额总和 转化为a表
(select category,sum(TOTALPRICE) sum_price from tax_info_initem group by category) b,--进项明细按纳税种类算出该类的金额总和 转化为b表
(select * from yys.tax_relation_detail where RELATIONID in
(select verid from yys.tax_version where verstate='1')) c --括号里面是找到当前使用版本的id 查询改版本下的抵扣关系 转化为c表
where a.category=c.outitem and instr(','||c.initem||',',','||b.category||',') > 0 ) --因为多个进项对应一个销项,所以
--根据条件找出销项中对应可以抵扣的进项纳税种类 同时 因为进项配置的时候是‘1,2,3’这种格式 所以需要转化格式
group by sum_price,category ; --找出来的应该是纳税种类对应的可抵扣的纳税种类的数据 根据销项的纳税种类将数据分组汇总 相减