2015-05-07 51 views
2

我试图在TSQL返回结果只有显示有多个名称的地址。棘手的部分已经有多个重复已经在这张表中...所以我试过的有计数变化不起作用,因为他们都有一个数大于一。所以我一直无法很容易地区分具有相同地址的唯一名称。下图所示的解决方案是我想生产什么...我有,但我的解决办法是内访问一个悲伤的过去抛弃的努力,我结束了查询中使用三个子查询得到的结果:返回不同的值,其中一列相同,但一列不同

Address    Name 
101 1st Ave   Brian Wood 
101 1st Ave   Amy Wood 
101 1st Ave   Adam Wood 
555 5th St   Sarah Parker 
555 5th St   Parker Corp. 

样本数据是这样的:

Address    Name 
101 1st Ave   Brian Wood 
101 1st Ave   Brian Wood 
101 1st Ave   Brian Wood 
101 1st Ave   Amy Wood 
101 1st Ave   Adam Wood 
555 5th St   Sarah Parker 
555 5th St   Sarah Parker 
555 5th St   Sarah Parker 
555 5th St   Parker Corp. 

我一直试图让这个好几个小时......我知道自己是一个更简单的方法来做到这一点,但它一直在16小时一天,它是2: 00我只是无法理解它。

这里是我最好的TSQL结果的例子...它的伎俩,但它对颠簸它分为两个不同的列:

SELECT DISTINCT t1.Name, t2.Name, t1.Address 
FROM tblLeads t1 
    JOIN tblLeads t2 ON t1.Address = t2.Address 
WHERE t1.Name <> t2.Name 
ORDER BY t1.Address 
+4

显示你已经尝试过的情况。另外,您已经显示了期望的结果,但是样本数据是什么? –

+0

所以要清楚,你想要显示1个地址有多个名字的行(在这个例子中所有的地址)? – NickyvV

+1

在您使用地址和名称的示例数据中,在使用街道和姓氏的示例中?!? –

回答

5

你可以做一个GROUPCOUNT(Distinct Name) > 1超过1获得地址唯一的名称,然后在上面的分组地址上使用过滤器进行选择。

SELECT DISTINCT Address,Name 
From Table1 
WHERE Address IN (
SELECT Address 
FROM Table1 
GROUP BY Address 
HAVING COUNT(distinct Name) > 1 
) 
+0

非常不错...额外的+1 COUNT(DISTINCT名称)...我从来没有见过DISTINCT以这种方式使用,所以它从来没有发生过我尝试...这正是我所需要的 –

+0

简明,但有一个地址是'NULL'的问题。 http://sqlfiddle.com/#!6/5cd9b/3/0 –

+0

正确的话,如果数据的地址是NULLs,这个sql会排除这些记录。根据OP的数据,我认为这不是一个问题。 – ughai

2

使用EXISTS验证相同的地址,但其他名称:

SELECT DISTINCT t1.LastName, t1.Street 
FROM tblLeads t1 
WHERE EXISTS (select 1 from tblLeads t2 
       where t1.Street = t2.Street 
       and t1.LastName <> t2.LastName) 
ORDER BY t1.Street 
5

您可以使用多个CTE's来简化这一任务。你首先要清理你的数据,所以删除所有这些重复,因此你可以使用DISTINCT。然后使用Count(*)OVER(Partition By Address)Address得到行数:

WITH CleanedData AS 
(
    SELECT DISTINCT Address, Name 
    FROM dbo.tblLeads 
), 
CTE AS 
(
    SELECT Address, Name, 
      cnt = Count(*) OVER (Partition By Address) 
    FROM CleanedData 
) 
SELECT Address, Name 
FROM CTE 
WHERE cnt > 1 

Demo

顺便说一句,这个作品也如Addressnull值:Demo(相对于this)。

+0

伟大的解决方案! –

0

替代解决方案蒂姆一个没有CTE:

select address, name 
from (select t.*, count(*) over(partition by address) as cnt 
    from (select distinct address, name from tblLeads) t 
) where cnt > 1 
相关问题