2015-05-07 53 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 
相關問題