在上图中独立的记录是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