【问题标题】:Having in SQL statement isn't returning accurate results在 SQL 语句中没有返回准确的结果
【发布时间】:2015-10-14 17:59:34
【问题描述】:

我有一个从临时表返回客户数据的查询。临时表仅存储客户编号的名字和姓氏。它有大约 320 条记录,供有资格参加计划的人使用。

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

我在上面写了包含 count customer_no > 1 但它不起作用,因为它返回一个空数据集。

请指教。 谢谢你。

【问题讨论】:

    标签: sql-server join group-by having


    【解决方案1】:

    您需要使用连接

    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
    

    附带说明,如果您必须使用 distinct,您可能做错了。


    有时你需要这样做:

    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 更好的字段作为排序依据,例如更新日期或创建日期。

    【讨论】:

    • 对这里的更改表示歉意......它不起作用。我的第一组记录回来了两次。 86224371、86224371、86313525、86390546。是的,地址不同,但我不在乎这些。我需要为用户提供唯一的客户编号。所以我只需要它是 86224371、86313525、86390546。
    • 好的,它怎么不工作...你期望它不工作是什么?
    • 我们有一个包含多个地址的记录,并且它被多次返回和计数。但我只希望在名称不同且客户编号不同的情况下发生这种情况。
    • 您的问题中没有涉及计数的内容,所以我不知道您所说的“被退回和计数”是什么意思
    • 如果您查看我的输出数据,第一个带有 4 行的数据,客户编号在两条记录上出现两次 - 因为加入时有两个地址。我想要的是回来一次。我不在乎哪条记录,但客户编号应该出现一次(就像我在第三个输出集示例中一样)
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 2020-09-08
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2016-02-03
    相关资源
    最近更新 更多