2014-07-19 46 views
1

我有這樣的查詢:通過在remuving一個SQL查詢中使用組複製

select 
o.Name, 
o.Family, 
o.phone, 
o.OBJECTID, 
o.owner_id, 
l.Licence_Contex, 
l.Licence_title, 
l.Id 
from 
[dbo].[owner_licence] as l,[dbo].[OWNER] as o 
where o.[owner_id] =l.[Owner_ID] 
    And l.Id 
    NOT IN 
     (select l.id from [dbo].[owner_licence] as l,[dbo].[OWNER] as o 
     where o.[owner_id] =l.[Owner_ID] 
     And (l.Registration_date1 > DATEADD(year, -1, GetDate()) 
     or l.[Registration_date2]> DATEADD(year, -1, GetDate()) 
     or l.[Registration_date3]> DATEADD(year, -1, GetDate()) 
     or l.[Registration_date4] > DATEADD(year, -1, GetDate()) 
     or l.[Registration_date5]> DATEADD(year, -1, GetDate()))) 

結果是一些如何這樣

john smith 09305689220 1080199884 1 licencetitle_1 licencecontex_1 10 
John Smith 09305689220 1080199884 1 licencetitle_2 licencecontex3 13 

正如你可以看到這兩個行是爲同一個人,我想這些重複的人聚合成一行..有沒有辦法做到這一點?我useg group by o.owner_id也是截然不同的,但他們不工作..

+0

您需要一些邏輯來聚合它們。你想總結什麼數據?採取最大的?最低?平均?你想忽略任何數據嗎?哪一個?爲什麼?附:你的查詢是不可讀的...你可以花一些時間格式化它嗎? – Ben

+0

你能否請格式化你的查詢 –

+0

@哈迪克感謝我的朋友我編輯了它 –

回答

0

子查詢將許可證限制爲每個所有者最多(合格)ID最多的那個許可證,因此您應該只爲每個所有者獲得1個許可證(因此爲1行)。

select 
o.Name, 
o.Family, 
o.phone, 
o.OBJECTID, 
o.owner_id, 
l.Licence_Contex, 
l.Licence_title, 
l.Id 
from 
[dbo].[owner_licence] as l 
join [dbo].[OWNER] as o on o.[owner_id] = l.[Owner_ID] 
join (select 
    max(ol.id) max_lid, 
    ol.owner_id 
from 
    owner_licence ol 
where ol.id not in (select l.id from [dbo].[owner_licence] as l,[dbo].[OWNER] as o 
     where o.[owner_id] =l.[Owner_ID] 
     And (l.Registration_date1 > DATEADD(year, -1, GetDate()) 
     or l.[Registration_date2]> DATEADD(year, -1, GetDate()) 
     or l.[Registration_date3]> DATEADD(year, -1, GetDate()) 
     or l.[Registration_date4] > DATEADD(year, -1, GetDate()) 
     or l.[Registration_date5]> DATEADD(year, -1, GetDate()))) 
group by 
    ol.owner_id) t1 on t1.owner_id = o.owner_id AND t1.max_lid = l.id 
+0

謝謝我的朋友,它效果很好 –

1

如果你想這就像你一排將需要從SElect子句中刪除最後一列。

使用分組按分號

+0

有3列與不同的數據,這當然不是唯一的選擇... – Ben

+0

感謝您的幫助..我沒有得到哪一列?l.Id?如果我刪除這個我不能使用NOT IN –

+0

只是從選擇線索刪除l.id列它應該工作。是給你什麼錯誤? –

0

您有一個複雜的查詢。這裏是一個方式做你想要什麼:

with t as (
     <your query here> 
    ) 
select Name, Family, phone, OBJECTID, owner_id, Licence_Contex, Licence_title, 
     max(Id) as id 
from t 
group by Name, Family, phone, OBJECTID, owner_id, Licence_Contex, Licence_title; 

你需要group by所有列除了有重複的一個。爲此,您需要選擇一個值。該查詢選擇最大值。

Distinct不起作用,因爲它適用於select中的所有行,包括在不同行上具有不同值的id

+0

謝謝我的朋友..你的建議它的工作原理 –

+0

哇..我mitake ..我已經刪除記錄螞蟻它顯示了一個記錄,但現在你的方法再給我兩個記錄..FuzzyTree方法現在工作正常 –