2017-03-05 45 views
0

我试图使用MS SQL将数据从一个系统移动到另一个系统。在第一个系统中,发票的税项元素位于单独的行中,另一行中则分配为净额和税额,并且是同一行。在SQL表中通过网络发票分割增值税

如果发票上有多个项目,这意味着税收需要分配到每一行。

我认为使用分区是答案,但我也认为我得到了一些错误的东西。

有问题的代码,我想的是:

 , CASE 
      WHEN a.ACTINDX = 11 
      THEN 0 
      ELSE (a.DEBITAMT - a.CRDTAMNT) 
      END AS [Net Amount] 
     , CASE 
      WHEN a.ACTINDX = 11 THEN 0 
      ELSE SUM(a.DEBITAMT-a.CRDTAMNT) OVER (PARTITION BY a.ORCTRNUM) 
      END AS [Tax Amount] 

示例数据:

ACTINDX DEBITAMT CRDTAMNT ORCTRNUM   PK 
     11  40.00000 0.00000  V007502   74058 
     16  -240.00000 0.00000  V007502   74059 
    1708  50.00000 0.00000  V007502   74060 
    1708  50.00000 0.00000  V007502   74061 
    1736  50.00000 0.00000  V007502   74062 
    1781  50.00000 0.00000  V007502   74063 

应该结束了看起来像:

ACTINDX DEBITAMT  CRDTAMNT ORCTRNUM   PK 
     16  -240.00000 00.00000  V007502   74059 
    1708  50.00000 10.00000  V007502   74060 
    1708  50.00000 10.00000  V007502   74061 
    1736  50.00000 10.00000  V007502   74062 
    1781  50.00000 10.00000  V007502   74063 

的40.0顶行税消失,因为价值在发票的四行中按比例分摊。

我已经看过各种网站(例如Baker's Dozen,Stack自己的(例如13290775),微软等),这些都导致我将分区作为解决方案。 Bakers Dozen似乎是最接近的(http://www.codemag.com/Article/1112061),但我不确定如何将Tip One中的编码添加到我的查询中。

我不介意写两个查询,一个提取没有税线的所有数据,另一个只有税线,然后加入他们,通过发票分配税款,但无法让我的头了解如何做到这一点。

我还在考虑是否将整个表格放入Excel中并在该软件中执行,因为这样做相对容易。

我也注意到,不可能对发票的所有元素应用统一税率,因为有些税率可能不含税或减税。

任何建议将被真正感激地接受。

回答

1

与窗口功能的帮助...

Declare @YourTable table (ACTINDX int,DEBITAMT money,CRDTAMNT money,ORCTRNUM varchar(25), PK int) 
Insert Into @YourTable values 
( 11, 40.00000, 0.00000, 'V007502' ,74058), 
( 16,-240.00000, 0.00000, 'V007502' ,74059), 
(1708, 50.00000, 0.00000, 'V007502' ,74060), 
(1708, 50.00000, 0.00000, 'V007502' ,74061), 
(1736, 50.00000, 0.00000, 'V007502' ,74062), 
(1781, 50.00000, 0.00000, 'V007502' ,74063) 

Select ACTINDX 
     ,DEBITAMT 
     ,CRDTAMNT = case when ACTINDX not in (16) then VAT else 0 end 
     ,ORCTRNUM 
     ,PK 
From (
     Select * 
       ,VAT = DEBITAMT *(sum(case when ACTINDX=11 then DEBITAMT end) over (Partition By ORCTRNUM)/sum(case when ACTINDX not in (11,16) then DEBITAMT else 0 end) over (Partition By ORCTRNUM)) 
     From @YourTable 
    ) A 
Where ACTINDX not in (11) 
Order By PK 

返回

enter image description here

+0

感谢您的建议,约翰。我明天会试试这个,然后更新我的帖子。 – user3398652

+0

看起来很对我 – SqlZim

+0

@SqlZim我们将会看到。可能的精度/舍入问题取决于公差;) –