2017-02-21 1 views
-4

Ich habe eine Reihe von Datensatz. Basierend auf den folgenden Daten, wie Sie alle Transaktionen (XZ) für bestimmte Kundenrechnungen (XR) erhalten.Erhalten Sie alle Zahlungstransaktionen mit SQL

Legend

XR - customer invoice 
XZ - payments 
XA - manual clearing 

Beispiel 1

Doc Nos  Type TY Amount  Cleared Doc 
9500011864 A121 XR 36247.62 9000001660 
9600009487 A121 XZ  -4.76 9000001660 
9000001660 A121 XA 36242.86 9600012264 
9600012264 A121 XZ -72490.48 9600012264 

CONDITION

Doc Nos : 9500011864 
TY  : XR 

SOLL OUTPUT

Doc Nos  Type TY Amount  Cleared Doc 
9600009487 A121 XZ  -4.76 9000001660 
9600012264 A121 XZ -72490.48 9600012264 

Erklärung oben: Es gibt Kunden Rechnung (XR) mit dem Betrag von 36,247.62. Für Dokumentennummern (9500011864) wird eine Zahlung (XZ) mit dem Wert 4,76 erfasst. Da es sich um eine Teilzahlung handelt, gibt es einen manuellen Ausgleichssaldo (XA) in Höhe von 36.242,86. Eine weitere Zahlung wird (XZ) mit dem Betrag von 72.490,48 (Nr. 9000001660) gebucht.

Beispiel 2

Doc Nos  Type TY Amount  Cleared Doc 
9500011864 A121 XR 36247.62 9000001660 
9600009487 A121 XZ  -4.76 9000001660 
9000001660 A121 XA 36242.86 9000001661 
9000001661 A121 XZ  -2.86 9000001661 
9000001661 A121 XA 36240.00 9600012264 
9600012264 A121 XZ -36240.00 9600012264 

CONDITION

Doc Nos : 9500011864 
TY  : XR 

GEWÜNSCHTEN OUTPUT

Doc Nos  Type TY Amount  Cleared Doc 
9600009487 A121 XZ  -4.76 9000001660 
9000001661 A121 XZ  -2.86 9000001661 
9600012264 A121 XZ -36240.00 9600012264 

Beispiel 3

Doc Nos  Type TY Amount  Cleared Doc 
9500000368 A121 XR 36247.62 9000000022 
9000000022 A121 XA -36247.62 9000000022 
9000000022 A121 XA 36247.62 9000000022 
9600016951 A121 XZ -36247.62 9000000022 

ZUSTAND

Doc Nos : 9500000368 
TY  : XR 

SOLL OUTPUT

Doc Nos  Type TY Amount  Cleared Doc 
9600016951 A121 XZ -36247.62 9000000022 

Ich bin mit SQL Server 2016. Ich bin demütig für SQL Experten bitten, mir zu helfen, auf diesem Prozess. Kann CTE Recursive darauf angewendet werden ?. Danke im Voraus!

+0

1) Für Beispiel 1. Was ist die Beziehung zwischen den zwei gewünschten Aufzeichnungen '9600009487' &' 9600012264', während die Bedingung nur '9500011864' ist? ........ 2) Worum geht es bei der Verwendung von 'where TY = 'XZ''? –

+1

basierend auf Ihrem gegebenen Szenario: Sie tun dies einfach ---> wählen * aus der Tabelle, wo [TY] = 'XZ' hoffe, das könnte helfen. –

+1

Dies ist ein rekursiver Prozess. Ihre Beziehung basiert auf Clearing-Dokumenten. XR Clearing-Dokument zu XZ Clearing-Dokument, sowie XA Clearing-Dokument zu XZ Clearing-Dokument. Wenn Teilzahlung (XZ) Clearing-Dokument zu (XA) Dokument Nr. – user1852837

Antwort

0

Sie benötigen eine rekursive Abfrage. Sie wählen den XR-Datensatz für die angegebenen "Doc-Nos" aus. Mit "Cleared Doc" finden Sie verwandte Datensätze (wobei "related" bedeutet, dass sie diese Nummer entweder in "Doc Nos" oder "Cleared Doc" haben, abhängig von ihrer TY). Mit allen so gefundenen Datensätzen machen Sie das gleiche mit ihrem "Cleared Doc", etc. Zuletzt zeigen Sie alle XZ-Datensätze aus den gefundenen Zeilen an.

with cte(doc_nos, type, ty, amount, cleared_doc) as 
(
    select doc_nos, type, ty, amount, cleared_doc 
    from mytable 
    where doc_nos = 9500011864 and ty = 'XR' 
    union all 
    select t.doc_nos, t.type, t.ty, t.amount, t.cleared_doc 
    from cte 
    join mytable t on (cte.ty = 'XR' and t.ty = 'XZ' and cte.cleared_doc = t.cleared_doc) 
       or (cte.ty = 'XR' and t.ty = 'XA' and cte.cleared_doc = t.doc_nos) 
       or (cte.ty = 'XA' and t.ty = 'XZ' and cte.cleared_doc = t.doc_nos) 
) 
select * 
from cte 
where ty = 'XZ'; 
0

Abhängig von Ihrem Senioren, was Sie gesagt haben

XR Clearing doc zu XZ Clearing doc, sowie XA Clearing doc zu XZ Clearing doc

und die Bedingungen sollten für Doc Nos sein & TY

Hope this help: -

Select * from table 
where TY = (Get the TY value here based on conditions of Doc Nos & TY) 

Demo: -

Create table MyTable (Doc_Nos varchar(20) , [type] varchar (10) , TY char (2) , Amount Decimal (18,2) , Cleared_Doc varchar(20)) 
go 
insert into MyTable values ('9500011864' , 'A121' , 'XR' , 36247.62 , '9000001660') 
insert into MyTable values ('9600009487' , 'A121' , 'XZ' , -4.76 , '9000001660') 
insert into MyTable values ('9000001660' , 'A121' , 'XA' , 36242.86 , '9600012264') 
insert into MyTable values ('9600012264' , 'A121' , 'XZ' , -72490.48 , '9600012264') 
go 

declare 
     @sDocNos varchar(20), 
     @TY  char (2) 

select 
     @sDocNos = '9500011864' , 
     @TY  ='XR' 

Select * from MyTable 
where TY = (
      select TY 
      from MyTable 
      where Cleared_Doc = (
       select Cleared_Doc 
       from MyTable 
       where Doc_Nos = @sDocNos 
       and TY = @TY) and TY = 'XZ') 

Ergebnis: -

enter image description here

Verwandte Themen