税额如何平摊到项目中,做到没有差额

来自外太空的你 2019-07-30 02:45:19


请教大神 在数据库查询中 如上增值税如何 按照金额 收货的金额 平摊到 每个品相的上,
因为 我所使用的是 采购总额/全部的总额*增值税 但是这样会造成除不尽的问题,使分摊后的总额 和 给出的总额不相等


望大师指导该如何写查询语句
以下为测试数据
id 公司货物名称 采购价格 收货数量 单位 采购总额 汇率 货币名称 采购单号 增值税
1 后勤部门物资 16.6 4 EACH 66.4 1 人名币 C-2019-07-01-100001 3213
2 (194)小牛臀肉 75 300 KG 22500 1 人名币 C-2019-07-13-100004
3 (国产) 平湖老鸡 16.6 220 KG 3652 1 人名币 C-2019-07-16-100006


...全文
216 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 唐诗三百首 的回复:

create table #t
(id int,公司货物名称 varchar(30),采购价格 decimal(18,1),收货数量 int,单位 varchar(10),采购总额 decimal(18,1),汇率 int,货币名称 varchar(10),采购单号 varchar(20),增值税 decimal(18,2))

insert into #t
select 1,'后勤部门物资',16.6,4,'EACH',66.4,1,'人名币','C-2019-07-01-100001',3213 union all
select 2,'(194)小牛臀肉',75,300,'KG',22500,1,'人名币','C-2019-07-13-100004',3213 union all
select 3,'(国产) 平湖老鸡',16.6,220,'KG',3652,1,'人名币','C-2019-07-16-100006',3213


-- 分摊增值税
;with t as
(select 采购总额,
增值税,
bl=采购总额/(select sum(采购总额) from #t),
rn=row_number() over(order by id)
from #t)
update t
set t.增值税=case when t.rn=(select max(rn) from t)
then t.增值税-(select sum(u.bl*u.增值税)
from t u
where u.rn<t.rn)
else t.bl*t.增值税 end
from t


-- 结果
select * from #t

/*
id 公司货物名称 采购价格 收货数量 单位 采购总额 汇率 货币名称 采购单号 增值税
----------- ------------------------------ --------------------------------------- ----------- ---------- --------------------------------------- ----------- ---------- -------------------- ---------------------------------------
1 后勤部门物资 16.6 4 EACH 66.4 1 人名币 C-2019-07-01-100001 8.14
2 (194)小牛臀肉 75.0 300 KG 22500.0 1 人名币 C-2019-07-13-100004 2757.32
3 (国产) 平湖老鸡 16.6 220 KG 3652.0 1 人名币 C-2019-07-16-100006 447.54

(3 行受影响)
*/


-- 验算
select 总增值税=sum(增值税) from #t

/*
总增值税
---------------------------------------
3213.00

(1 行受影响)
*/
高手!!
唐诗三百首 2019-07-31
  • 打赏
  • 举报
回复

create table #t
(id int,公司货物名称 varchar(30),采购价格 decimal(18,1),收货数量 int,单位 varchar(10),采购总额 decimal(18,1),汇率 int,货币名称 varchar(10),采购单号 varchar(20),增值税 decimal(18,2))

insert into #t
select 1,'后勤部门物资',16.6,4,'EACH',66.4,1,'人名币','C-2019-07-01-100001',3213 union all
select 2,'(194)小牛臀肉',75,300,'KG',22500,1,'人名币','C-2019-07-13-100004',3213 union all
select 3,'(国产) 平湖老鸡',16.6,220,'KG',3652,1,'人名币','C-2019-07-16-100006',3213


-- 分摊增值税
;with t as
(select 采购总额,
增值税,
bl=采购总额/(select sum(采购总额) from #t),
rn=row_number() over(order by id)
from #t)
update t
set t.增值税=case when t.rn=(select max(rn) from t)
then t.增值税-(select sum(u.bl*u.增值税)
from t u
where u.rn<t.rn)
else t.bl*t.增值税 end
from t


-- 结果
select * from #t

/*
id 公司货物名称 采购价格 收货数量 单位 采购总额 汇率 货币名称 采购单号 增值税
----------- ------------------------------ --------------------------------------- ----------- ---------- --------------------------------------- ----------- ---------- -------------------- ---------------------------------------
1 后勤部门物资 16.6 4 EACH 66.4 1 人名币 C-2019-07-01-100001 8.14
2 (194)小牛臀肉 75.0 300 KG 22500.0 1 人名币 C-2019-07-13-100004 2757.32
3 (国产) 平湖老鸡 16.6 220 KG 3652.0 1 人名币 C-2019-07-16-100006 447.54

(3 行受影响)
*/


-- 验算
select 总增值税=sum(增值税) from #t

/*
总增值税
---------------------------------------
3213.00

(1 行受影响)
*/
RINK_1 2019-07-30
  • 打赏
  • 举报
回复
引用 3 楼 来自外太空的你 的回复:
[quote=引用 1 楼 RINK_1 的回复:] 下面方法不知道是否可行:排个序,除最后一条数据,其它数据都用你说的那个计算方法计算,然后最后一条数据拿总额减去先前已经得到的其它数据的总和。
请问能实际操作下 演示下吗,这个我不知道怎么弄[/quote]

DECLARE @VAT DECIMAL(12,4)

SET @VAT=100

;WITH CTE
AS
(SELECT *,ROUND((PRICE/SUM(PRICE) OVER (PARTITION BY GETDATE()))*@VAT,2) AS APPORTION,
 MAX(ID) OVER (PARTITION BY GETDATE()) AS MAX_ID FROM #T)

SELECT *,
CASE WHEN ID<MAX_ID THEN APPORTION ELSE @VAT-SUBTOTAL END
FROM CTE A
CROSS APPLY (SELECT SUM(APPORTION) AS SUBTOTAL FROM CTE WHERE ID<A.ID) AS B
  • 打赏
  • 举报
回复
引用 1 楼 RINK_1 的回复:
下面方法不知道是否可行:排个序,除最后一条数据,其它数据都用你说的那个计算方法计算,然后最后一条数据拿总额减去先前已经得到的其它数据的总和。

但是我是批量查询 不只是几条数据
  • 打赏
  • 举报
回复
引用 1 楼 RINK_1 的回复:
下面方法不知道是否可行:排个序,除最后一条数据,其它数据都用你说的那个计算方法计算,然后最后一条数据拿总额减去先前已经得到的其它数据的总和。

请问能实际操作下 演示下吗,这个我不知道怎么弄
听雨停了 2019-07-30
  • 打赏
  • 举报
回复
按照你这么说,那就没有办法完全平摊了啊,比如说10块钱,分摊到三个人头上,不可能分的每个人一样多的啊
RINK_1 2019-07-30
  • 打赏
  • 举报
回复
下面方法不知道是否可行:排个序,除最后一条数据,其它数据都用你说的那个计算方法计算,然后最后一条数据拿总额减去先前已经得到的其它数据的总和。

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧