在上圖中獨立的記錄是Serial#
和Part#
樣本名單,我已經從我的數據庫中檢索。
每個PN必須有一個配對的PN
這樣的:
P04-000001- -V000 = P04-000001- -V000
P04-000001-00111-V000
P04-000001-10111-V000
表示較低的零件編號,表示較高的零件編號。
我的要求是排除或只是標記有過剩或沒有配對的行,其中SN 。
我仍然在想辦法解決這個問題,所以我還沒有發佈我試過的東西。
在上圖中獨立的記錄是Serial#
和Part#
樣本名單,我已經從我的數據庫中檢索。
每個PN必須有一個配對的PN
這樣的:
P04-000001- -V000 = P04-000001- -V000
P04-000001-00111-V000
P04-000001-10111-V000
表示較低的零件編號,表示較高的零件編號。
我的要求是排除或只是標記有過剩或沒有配對的行,其中SN 。
我仍然在想辦法解決這個問題,所以我還沒有發佈我試過的東西。
您可以使用row_number()生成一個可以將行與之配對的標識。使用完全外連接從C0
和C1
獲取不匹配的行。
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
謝謝SIr!它工作完美! – BizApps 2012-01-10 23:29:55
看來您需要以不同的方式組織您的數據,以確保您始終擁有一對。根據您的要求,以下內容應該至少向您展示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
什麼各種SQL的嘗試? MySQL的?甲骨文? MS SQL Server?等等? – MatBailie 2012-01-10 08:24:33
我用MS SQL Server。 – BizApps 2012-01-10 08:25:49
最後兩行(SN 12和13)似乎不符合您的標準('00111'和'10111')。 – Richard 2012-01-10 08:51:02