2015-10-14 60 views
2

我有一个查询从临时表中返回客户数据。临时表仅存储客户编号的名字和姓氏。它有资格参加一个节目的人的约320条记录。在SQL语句中返回不正确的结果

create table #customers 
(
customer_no int, 
fname varchar(20), 
lname varchar(55) 
) 

我需要从数据库中做的是说给我从谁拥有姓氏和名字的组合,我们的整个数据库大家(找到重复)。我们还需要提取地址,但我们不希望在搜索中使用客户编号,因为我们稍后需要编号,但现在我们希望比较仅限于名和姓。

select distinct a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
where (
     lname in (select lname from #customers) and 
     fname in (select fname from #customers) 
     ) 
order by a.lname, a.fname 

因此该查询返回的结果是记录一个很好的一长串 - 然而,由于存在大量的重复组合(它带回客户号多次)。

例如:

customer_no fname mname lname street1    city 
86224371 John NULL Cornid 11 Maplewood Dr. New Haven 
86224371 John NULL Cornid 11 Maplewood Drive Hartford 
86313525 John NULL Cornid 11 Maplewood Dr  Hartford 
86390546 John Seth Cornid 11 Maplewood dr. New Haven 

所以数据是正确的。 唯一的问题是我想压制第一行 - 我想说给我唯一的客户号码。我想我的输出是:

customer_no fname mname lname street1    city 
    86224371 John NULL Cornid 11 Maplewood Dr. New Haven 
    86313525 John NULL Cornid 11 Maplewood Dr  Hartford 
    86390546 John Seth Cornid 11 Maplewood dr. New Haven 

我们必须提供基本信息来清理数据 - 我们只希望每个客户编号都拉一次。

select distinct a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
where (
     lname in (select lname from #customers) and 
     fname in (select fname from #customers) 
     ) 
group by a.customer_no, 
      a.fname, 
      a.mname, 
      a.lname, 
      b.street1, 
      b.street2, 
      b.city, 
      b.state, 
      b.postal_code 
having count(a.customer_no) > 1 
order by a.lname, a.fname 

我写上述包括具有计数CUSTOMER_NO> 1,但它不工作,因为它返回一个空数据集。

请指教。 谢谢。

回答

4

你需要使用一个连接

select 
     a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
join #customers c on a.lname = c.lname and a.fname = c.fname 
order by a.lname, a.fname 

作为一个侧面说明,如果你必须使用不同的你可能做错了。


有时你需要这样做:

join #customers c on upper(a.lname) = upper(c.lname) and upper(a.fname) = upper(c.fname) 

有时你需要这样做:

join #customers c on trim(a.lname) = trim(c.lname) and trim(a.fname) = trim(c.fname) 

这可能是一个不同的问题,但在下面

评论

我们有多个地址的记录,并且它被返回并且 被多次计数。但我只希望这样的,如果名字 是不同的发生 - 和客户数是不同的

要只“指望”一次我会做这样的:

select * from 
(
    select a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
     row_number(partition by a.fname, a.lname, a.customer_no 
        order by street1, stree2) as rn 
    from T_CUSTOMER a 
    join T_ADDRESS b on a.customer_no = b.customer_no 
) x 
where rn = 1 

不是我会建议一个更好的场比street1更接近订单,例如更新日期或创建日期。

+0

对此处的更改抱歉......这不起作用。我有第一套记录回来两次。 86224371,86224371,86313525,86390546.是的地址是不同的,但我不在乎那些。我需要为用户提供唯一的客户号码。所以我需要它是86224371,86313525,86390546只。 – Elizabeth

+0

好吧,它怎么不起作用......你期望它没有做什么? – Hogan

+0

我们有多个地址的记录,并且它被返回并计数多次。但是,如果名称不同,我只希望发生这种情况 - 并且客户号码不同。 – Elizabeth