2017-02-07 6 views
0

私は一連のレコードを持っています。伝説がSQLを使用してルートトランザクションを取得

XR - is the lowest root transaction 
XZ - is the highest root transaction 
XA - can generate multiple times 

ドク番号

と同等であるルート・トランザクション(XR)を取得する方法を、以下のデータに基づいてデータ

Doc Nos  Type TY Amount  Cleared Doc 
9500011864 | A121 | XR | 36247.62 | 9000001659 
9000001659 | A121 | XA |  1.00 | 9000001660 
9000001660 | A121 | XA | 36242.86 | 9600012264 
9600012264 | A121 | XZ | -72490.48 | 9600012264 

条件

Doc Nos : 9600012264 
TY  : XZ 

所望の出力

Doc Nos  Type TY Amount  Cleared Doc 
9500011864 | A121 | XR | 36247.62 | 9000001659 

はCTE再帰が、このアプローチに適用されたSQLができます。私はSQL Server 2016を使用していますか?お願いします。誰かが私のためにコードを行うことができますし、私はそれを改善します。

+0

使用しているdbmsにタグを付けます。 (すべての製品がcteをサポートしているわけではありません) – jarlh

+0

CTEを使用する特別な理由はありますか?確かにWHERE TY = 'XZ'と[Doc Nos] = @DocumentParameterIDはこのトリックを行いますか? –

+0

あなたのDBMSが再帰的なCTEをサポートしている場合、これが行く方法です。 – Serg

答えて

0

再帰CTEでは、データの自己参照に注意してください。他のサイクルは存在しないことを願っています。必要に応じてデータ型を調整します。

declare @DocNos varchar(20) = '9600012264'; 
declare @TY varchar(10) ='XZ'; 
with rc as (
    select * 
    from Transactions t 
    where [Doc Nos] = @DocNos and [email protected] 
    union all 
    select t.* 
    from Transactions t 
    join rc on t.[Cleared Doc] = rc.[Doc Nos] 
     -- stop at self ref 
     and rc.[Doc Nos] != t.[Doc Nos] 
     and rc.TY !='XR' 
) 
select * 
from rc 
where TY='XR'; 
関連する問題