分开没有配对的记录

时间:2012-01-10 08:18:22

标签: c# sql sql-server linq

Query

在上图中,我是从我的数据库中检索到的Serial#Part#的示例列表。

每个PN必须有一个配对的PN

像这样:

P04-000001- 00111 -V000 = P04-000001- 10111 -V000

P04-000001-00111-V000

P04-000001-10111-V000

1 表示分号较低, 0 表示分号较高。

我的要求就是排除或仅标记超出或没有SN 8 的对的行。

我还在想办法解决这个问题,所以我还没有发布我尝试的内容。

2 个答案:

答案 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。使用完整的外部联接来获取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

相关问题