2013-01-15 55 views
1

问题:计数在SQL条件匹配

找到匹配的记录在Person表,其中姓氏和名字是相同的,或者,在SSN是相同的数量。

GIVENS

表结构:

FirstName 
LastName 
SSN 
RecordId 

DATA:在Person表

╔═══════════╦══════════╦═════════════╦══════════╗ 
║ FIRSTNAME ║ LASTNAME ║  SSN  ║ RECORDID ║ 
╠═══════════╬══════════╬═════════════╬══════════╣ 
║ Bob  ║ Smith ║ 111-11-1111 ║  1 ║ 
║ Robert ║ Smyth ║ 111-11-1111 ║  2 ║ 
║ Bob  ║ Smith ║ 222-22-2222 ║  3 ║ 
║ Tom  ║ Gunn  ║ 333-33-3333 ║  4 ║ 
║ Jim  ║ Gunn  ║ 444-44-4444 ║  5 ║ 
║ Jimmy  ║ Gunn  ║ 444-44-4444 ║  6 ║ 
║ Alice  ║ Jones ║ 555-55-5555 ║  7 ║ 
║ Alice  ║ Jones ║ 666-66-6666 ║  8 ║ 
╚═══════════╩══════════╩═════════════╩══════════╝ 

个期望的结果:

╔════════════╦═══════════╦══════════╦═════════════╦══════════╗ 
║ MATCHCOUNT ║ FIRSTNAME ║ LASTNAME ║  SSN  ║ RECORDID ║ 
╠════════════╬═══════════╬══════════╬═════════════╬══════════╣ 
║   3 ║ Bob  ║ Smith ║ 111-11-1111 ║  1 ║ 
║   2 ║ Robert ║ Smyth ║ 111-11-1111 ║  2 ║ 
║   2 ║ Bob  ║ Smith ║ 222-22-2222 ║  3 ║ 
║   1 ║ Tom  ║ Gunn  ║ 333-33-3333 ║  4 ║ 
║   2 ║ Jim  ║ Gunn  ║ 444-44-4444 ║  5 ║ 
║   2 ║ Jimmy  ║ Gunn  ║ 444-44-4444 ║  6 ║ 
║   2 ║ Alice  ║ Jones ║ 555-55-5555 ║  7 ║ 
║   2 ║ Alice  ║ Jones ║ 666-66-6666 ║  8 ║ 
╚════════════╩═══════════╩══════════╩═════════════╩══════════╝ 

我已经试过

我一直在使用这两个GROUP BY和LEFT自我试图JOIN来解决这个问题。

GROUP BY失败,因为没有办法有条件地分组。

LEFT自加入失败,因为它大致返回匹配数的平方。

我会发布我的尝试的代码,但我真正的表有大量的列,实际上要复杂得多,几乎肯定会掩盖这个问题。

+0

听起来像功课。用[你试过的]更新你的问题(http://www.whathaveyoutried.com),我将删除downvote。 – Kermit

+0

当你将问题简化为必需品时,它通常看起来像功课。我建议你可能不喜欢你的低票。 – bnieland

+0

对不起,你不喜欢我的downvote。我希望问题能够显示努力,而不是给代码,并期望它得到解决。我会推荐阅读[Jon Skeet的指南](http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx)关于如何写出一个好问题。 – Kermit

回答

3

,因为你没有提到的RDBMS,试试这个,

SELECT COUNT(*) MatchCount,a.* 
FROM person a 
     INNER JOIN person b 
      ON (a.firstname = b.firstname AND 
        a.lastname = b.lastname) OR 
        a.SSN = b.SSn 
GROUP BY firstname, lastname, ssn, recordid 
ORDER By recordid 

结果

| MATCHCOUNT | FIRSTNAME | LASTNAME |   SSN | RECORDID | 
-------------------------------------------------------------- 
|   3 |  Bob | Smith | 111-11-1111 |  1 | 
|   2 | Robert | Smyth | 111-11-1111 |  2 | 
|   2 |  Bob | Smith | 222-22-2222 |  3 | 
|   1 |  Tom |  Gunn | 333-33-3333 |  4 | 
|   2 |  Jim |  Gunn | 444-44-4444 |  5 | 
|   2 |  Jimmy |  Gunn | 444-44-4444 |  6 | 
|   2 |  Alice | Jones | 555-55-5555 |  7 | 
|   2 |  Alice | Jones | 666-66-6666 |  8 |

SQL Fiddle

+1

+1,希望你不介意编辑。 – Kermit

+0

@njk谢谢':D' –

+0

@ @ $$ $$,我对这样一个快速的回答印象深刻。我做了一些非常相似的事情,但是我的逻辑必然存在一些错误。我非常感谢帮助。 – bnieland