SQL:如何选择仅包含一个组的多个列

时间:2016-12-09 07:01:46

标签: sql sql-server

我需要查询表以获取DELIVERYCUSTOMER而没有重复的名称 在一张桌子里。 例如,请考虑下表和图片(另一个细节不同):

https://gist.github.com/danburzo/9254630

我尝试这样的查询

;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时,它就会显示客户起始名称的列表是' 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

3 个答案:

答案 0 :(得分: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%'

答案 1 :(得分:1)

您的表格未正常化。例如,找到另一个纬度和经度的相同地址是什么意思?在数据库中甚至不可能实现这一点。因此,您可能需要为地址,电话和联系人分别使用表格。

无论如何,根据给出的表格,您似乎只想看到每个客户的一个结果行,而不关心哪个地址,电话和联系人。

然后这就足够了:

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

如果您希望手机属于该地址,甚至可能显示纬度和逻辑,那么您不会聚合行,而是选择行。为此,您需要使用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;

答案 2 :(得分:0)

尝试以下查询

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

如果所有列中的值相同,那么您将只获得1条记录。