【问题标题】:SQL Server - Select distinct QuerySQL Server - 选择不同的查询
【发布时间】:2017-01-21 08:15:20
【问题描述】:

我有一个 tblA,我有几千个客户。我正在尝试编写一个查询,该查询将向我显示具有多个特定类型记录的客户。这就是我的桌子的样子。

ClientID          TypeB
123               1
145               1
123               2
199               1
199               2
145               2
123               1

正如您在此处看到的(这不是一个完整的表格,但这只是相关的)。每个客户端应该只有一条 TypeB=1 和 TypeB=2 的记录。然而,一些客户(123)有不止一条 TypeB=1 的记录。我正在尝试查找具有多个 Type=1 记录的所有客户端。

期望的最终结果:

ClientID           TypeB
123                1
123                1

这就是我一直在尝试做的事情

 select distinct(clientid), TypeB
 from tblA 
 where TypeB=1
 having count(TypeB)>1
 group by clientid

【问题讨论】:

  • 我知道您已经接受了答案,但我会注意到您实际上只需要在查询中反转 havinggroup byTypeB 上的分组不是解决方案的必要部分。
  • @shawnt00 - 我注意到它已经足够接近了。但有时我尝试构建一个查询,但我一直在 sql server 中收到错误,这很烦人,但我很接近。谢谢!

标签: sql sql-server select sql-server-2012


【解决方案1】:

我想你需要这样的东西

SELECT COUNT(ClientID), ClientID, TypeB
FROM tblA
WHERE TypeB = 1
GROUP BY ClientID, TypeB
HAVING COUNT(ClientID) > 1

【讨论】:

    【解决方案2】:

    你可以试试这个

    ;with cte as (
    select clientid, typeb, row_number() over(partition by clientid, typeb order by clientid) as rn
    from yourtable ) select clientid, typeb from cte where rn > 1
    

    【讨论】:

      【解决方案3】:

      尝试使用

      SELECT a.clientid, 
             a.typeb 
      FROM   tblA  a 
      WHERE  (SELECT Count(*) 
              FROM   tblA  b 
              WHERE  b.clientid = a.clientid 
                     AND b.typeb = 1) > 1 
      

      【讨论】:

        【解决方案4】:

        查看是否在sql server中工作:

        select *
        from client
        qualify sum()over(partition by clientId, typeB)>1
        

        另一个简单的方法是

        select *
        from client
        where clientId in 
        (select clientId 
        from client
        having count(*)>1)
        

        【讨论】: