2012-01-10 69 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