在上图中,我是从我的数据库中检索到的Serial#
和Part#
的示例列表。
每个PN必须有一个配对的PN
像这样:P04-000001- 00111 -V000 = P04-000001- 10111 -V000
P04-000001-00111-V000
P04-000001-10111-V000
1 表示分号较低, 0 表示分号较高。
我的要求就是排除或仅标记超出或没有SN 8 的对的行。
我还在想办法解决这个问题,所以我还没有发布我尝试的内容。
答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用row_number()生成可以将行配对的ID。使用完整的外部联接来获取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