2017-03-05 9 views
0

MS SQLを使用してあるシステムから別のシステムにデータを移動しようとしています。最初のシステムでは、請求書の税要素は別の行にあり、もう1つはネットと税と同じ行に割り当てられています。SQLテーブルの純請求書にVAT値を分割する

請求書に複数の明細がある場合は、税金が各明細行に割り当てる必要があることを意味します。

私はパーティションを使うのが答えだと思っていますが、私はそれに何か間違っていると思います。私がしようとしています

問題のコードは次のとおりです。

 , 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のトップライン税値がインボイスの4つの行に比例して分割されるので、この値は消えます。

私は解決策としてパーティションに向かうさまざまなWebサイト(Baker's Dozen、Stackの(e、g、13290775)、Microsoftなど)を見てきました。 Bakers Dozenが最も近いと思われますが(http://www.codemag.com/Article/1112061)、ヒント1にコーディングを追加する方法は不明です。

私は2つのクエリを書いても構いません.1つはタックスラインなしのすべてのデータを抽出し、もう1つは税ラインだけを抽出してから、その方法で請求書に税金を割り当てますが、 。

テーブル全体を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見てみましょう。公差によって可能な精度/丸めの問題; –

関連する問題