Sql server 在SQL表中跨净发票拆分增值税值

Sql server 在SQL表中跨净发票拆分增值税值,sql-server,Sql Server,我正在尝试使用MS SQL将数据从一个系统移动到另一个系统。在第一个系统中,发票的税务元素位于单独的行上,在另一个系统中,它被分配为净额和税款,并位于同一行 如果发票上有多个项目,这意味着需要在每一行中分配税款 我认为使用分区是解决问题的办法,但我也认为我的分区有问题 我正在尝试的问题代码是: , CASE WHEN a.ACTINDX = 11 THEN 0 ELSE (a.DEBITAMT -

我正在尝试使用MS 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 Tend、Stack自己的e、g、13290775、Microsoft等,它们引导我将分区作为解决方案。Bakers打的似乎是最接近的,但我不确定如何将Tip One中的编码添加到我的查询中

我不介意写两个查询,一个是提取所有数据而不包含税行,另一个是只提取税行,然后将它们连接起来,以这种方式在发票上分配税款,但我无法了解如何做

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

我还想指出的是,不可能对发票的所有要素适用统一税率,因为有些要素可能不征税或减税


如果您有任何建议,我们将不胜感激。

在窗口功能的帮助下

范例

返回


谢谢你的建议,约翰。明天我会试试这个,之后再更新我的帖子。@SqlZim我们拭目以待。可能的精度/舍入问题取决于公差;是的,我们会看看OP是否会回来。很抱歉延迟回复。很抱歉延迟回复。我在实际数据上尝试了这一点,结果遇到了一个被零除的错误。下一行提示警告:通过聚合或其他集合操作消除空值。这可能是因为一些增值税是零税率的(即无税收费或有信用证的地方)。对不起,我没有在我原来的帖子中考虑到这一点。我会看看我是否能得到一些失败的示例数据,我想这是…Summcase,当actindx不在11,16中时,DEBITAMT其他。。。这导致了它倒下。谢谢你到目前为止的建议。
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