簡體   English   中英

如何比較行中SQL的差異

[英]How to compare rows for differences in SQL

我有一個帶有DocNum,DocVer,ClientNum,MatterNum的表。 一些文檔的版本具有不同的ClientNum / MatterNum組合,我需要使用該信息創建報告。

1-我用DocNum,DocVer,ClientNum,MatterNum創建了一個表,該表的版本> 1,因為只有多於一個版本的文檔可能會受到影響。

2-我試圖找出如何最好地比較特定文檔的所有2+版本與1版本,並指出不匹配的地方。 (按DocNum,ClientNum,MatterNum或Join等分組)

我想要一個NULL來表示任何與第一個版本的ClientNum和MatterNum不匹配的2+版本。

樣本表數據:

docnum, version, client, matter    
351,    1,       15000,  00010    
351,    2,       15000,  00020

所需的輸出將是一列,該列表示文檔編號和版本與版本1不匹配。

docnum, version, client, matter, matched 

351,    1,       15000,  00010, y  

351,    2,       15000,  00020, n

您可以將僅具有版本2+記錄的新表加入到原始表的版本1記錄中。 case您可以檢查它們是否匹配,如果不匹配,則顯示null。

SELECT 
    yt.DocNum
  , yt.DocVer
  , CASE WHEN yt.ClientNum <> ot.ClientNum THEN NULL ELSE yt.ClientNum END AS 'ClientNum'
  , CASE WHEN yt.NatterNum <> ot.MatterNum THEN NULL ELSE yt.MatterNum END AS 'MatterNum'
FROM YourTable yt -- table with versions 2+
JOIN OriginalTable ot 
  ON yt.DocNum = ot.DocuNum AND ot.DocVer = 1

您可以使用基於版本號的自連接並測試問題列中值的變化,您將了解:

 declare @test table (docnum int, version int, client nvarchar(10), matter nvarchar(10));
 insert into @test
 values
 (351, 1, '15000', '00010'),
 (351, 2, '15000', '00020')

 -- assumes your version increases sequentially
 select t1.docnum, t1.matter, t2.matter, case when t1.matter <> t2.matter then 'flag' else 'ok' end [flag]
 from @test t1
 left join @test t2
 on t1.client = t2.client
 and t1.docnum = t2.docnum
 and t1.version = t2.version - 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM