2016-12-09 49 views
0

只有一個組選擇多列,我需要查詢表中的一個表得到DELIVERYCUSTOMER沒有重複的名字 。 例如,下面的表格考慮與圖片(另一個細節是不同的):SQL:如何通過

enter image description here

我嘗試這樣

;WITH Cutomers as (
    select DELIVERYCUSTOMER 
    from delivery_details 
    group by DELIVERYCUSTOMER) 
select 
    m.DELIVERYADDRESS1, 
    m.DELIVERYPHONE, 
    m.contact_person, 
    m.contact_address, 
    m.DELIVERYCUSTOMER, m.LATITUDE, m.LONGITUDE 
from delivery_details as m 
where DELIVERYCUSTOMER LIKE 'Sor%' 
join Cutomers as c on c.DELIVERYCUSTOMER = m.DELIVERYCUSTOMER 

結果查詢仍顯示重複名稱

我只需要當我搜索喜歡Bu它會顯示客戶開始名名單「卜」,我可以得到另一個細節展現,如地址,電話,緯度,經度

我在SQL運行數據將顯示像

SELECT DELIVERYCUSTOMER, DELIVERYADDRESS1, DELIVERYPHONE, contact_person, contact_address, LATITUDE, LONGITUDE 
FROM delivery_details WHERE DELIVERYCUSTOMER LIKE 'Bu%' GROUP BY DELIVERYCUSTOMER 

我得到的數據是這樣

enter image description here

此表

和列有超過40+ 我用這個得到

編輯 ::我用這個查詢來搜索DELIVERYCUTOMER來獲取名稱和在該表中,以便ID,delivery_type,delivery_order,等另一個細節是不同

SQL Server的版本是2012

+1

單個'DELIVERYCUSTOMER'有多個緯度和經度。如果你不想重複'DELIVERYCUSTOMER',那麼你會選擇哪一個「緯度/經度」? –

+0

如果你選擇m.LATITUDE,m.LONGITUDE那麼它顯示你重複。所以在選擇語句中刪除m.LATITUDE,m.LONGITUDE然後它將顯示唯一的結果 –

+0

@ swett.bp你不能這樣做,你將不得不將所有列在'select'中添加到'group by' –

回答

1

您的表格未規範化。例如,如何找到具有其他經緯度的相同地址,意味着什麼?這在數據庫中甚至是不可能的。因此,您可能需要單獨的地址,電話和聯繫人表格。

反正給定表,看來你只是想看看每個客戶一行結果並不在意哪個地址,電話和聯繫人。

那麼這個就足夠了:

select 
    deliverycustomer, 
    min(deliveryaddress1), 
    min(deliveryphone), 
    min(contact_person), 
    min(contact_address) 
from delivery_details 
group by deliverycustomer 
order by deliverycustomer; 

如果你希望手機屬於地址,甚至表現出緯度和logitude,那麼你就不會總結行,但行,而不是。爲了做到這一點,你的排名你的記錄每個客戶與ROW_NUMBER

select 
    deliverycustomer, 
    deliveryaddress1, 
    deliveryphone, 
    contact_person, 
    contact_address, 
    latitude, 
    longitude 
from 
(
    select 
    dd.*, 
    row_number() over (partition by deliverycustomer order by contact_person) as rn 
    from delivery_details dd 
) ranked 
where rn = 1 
order by deliverycustomer; 
+0

不要誤認我,只是讓你知道這個答案有和我發佈的幾乎相似的邏輯。我在你使用子查詢加入的地方使用了CTE。哈哈:-) – Aruna

+0

@阿魯納:是的,我花了一些時間來輸入這個,當我發佈它時,你已經寫了你的答案。你很快:-) –

+0

哈哈,是啊我輸入比你更少,因爲我認爲OP已經在'CTE'有知識:-) – Aruna

0

嘗試以下查詢

select DISTINCT 
    DELIVERYADDRESS1, 
    DELIVERYPHONE, 
    contact_person, 
    contact_address, 
    DELIVERYCUSTOMER, 
LATITUDE, 
LONGITUDE 
from delivery_details 

如果所有字段的值相同那麼你只會得到1條記錄。

1

你可以嘗試使用PARTITION BY的分組和ROW_NUMBER低於選擇一個記錄你的預期。

由於LATITUDELONGITUDE對於同一個客戶具有不同的值,所以此邏輯很有用。

;WITH Customers as (
    select 
    DELIVERYCUSTOMER, 
    DELIVERYADDRESS1, 
    DELIVERYPHONE, 
    contact_person, 
    contact_address, 
    DELIVERYCUSTOMER, 
    LATITUDE, 
    LONGITUDE, 
    ROW_NUMBER() OVER (PARTITION BY DELIVERYCUSTOMER) AS RowNumber 
    from delivery_details) 

select 
    * 
from Customers Where RowNumber = 1 and DELIVERYCUSTOMER LIKE 'Sor%' 
+0

謝謝so muchhh –