2012-01-10 64 views
2

Query有沒有對

在上圖中獨立的記錄是Serial#Part#樣本名單,我已經從我的數據庫中檢索。

每個PN必須有一個配對的PN

這樣的:

P04-000001- -V000 = P04-000001- -V000

P04-000001-00111-V000 

P04-000001-10111-V000 

表示較低的零件編號,表示較高的零件編號。

我的要求是排除或只是標記有過剩或沒有配對的行,其中SN 。

我仍然在想辦法解決這個問題,所以我還沒有發佈我試過的東西。

+0

什麼各種SQL的嘗試? MySQL的?甲骨文? MS SQL Server?等等? – MatBailie 2012-01-10 08:24:33

+0

我用MS SQL Server。 – BizApps 2012-01-10 08:25:49

+0

最後兩行(SN 12和13)似乎不符合您的標準('00111'和'10111')。 – Richard 2012-01-10 08:51:02

回答

0

您可以使用row_number()生成一個可以將行與之配對的標識。使用完全外連接從C0C1獲取不匹配的行。

with C0 as 
(
    select SN, 
     PN, 
     row_number() over(partition by PN order by SN) as rn 
    from YourTable 
    where substring(PN, 12, 1) = 0 
), 
C1 as 
(
    select SN, 
     PN, 
     row_number() over(partition by PN order by SN) as rn 
    from YourTable 
    where substring(PN, 12, 1) = 1 
) 
select coalesce(C0.SN, C1.SN) as SN, * 
from C0 
    full outer join C1 
    on C0.PN = stuff(C1.PN, 12, 1, '0') and 
     C0.rn = C1.rn 
where C0.SN is null or 
     C1.SN is null 

Stack Exchange Data Explorer

+0

謝謝SIr!它工作完美! – BizApps 2012-01-10 23:29:55

0

看來您需要以不同的方式組織您的數據,以確保您始終擁有一對。根據您的要求,以下內容應該至少向您展示PN沒有足夠的配對PN。

SELECT TT1.PN 
, LEFT(TT1.PN, 11) + '1' + RIGHT(TT1.PN, 9) AS PairedPN 
, COUNT(TT1.SN) AS PNCount 
, (SELECT COUNT(TT2.PN) 
    FROM YourTable TT2 
    WHERE TT2.PN = LEFT(TT1.PN, 11) + '1' + RIGHT(TT1.PN, 9)) AS PairedPNCount 
FROM YourTable TT1 
WHERE SUBSTRING(TT1.PN, 12, 1) = '0' 
GROUP BY TT1.PN 
HAVING COUNT(TT1.SN) - (SELECT COUNT(TT2.PN) 
      FROM YourTable TT2 
      WHERE TT2.PN = LEFT(TT1.PN, 11) + '1' + RIGHT(TT1.PN, 9)) <> 0