开发者

How do I return rows where there is more than one type?

I have the following data:

id         user_id         typecode     
-----------------------------------
10         123             'TypeA'
11         123            开发者_开发知识库 'TypeB'
12         124             'TypeA'
13         124             'TypeA'
14         125             'TypeA'
15         125             'TypeB'
16         125             'TypeB'
17         125             'TypeA'

I need a query that will return user_ids for users that have more than 1 'TYPEA' and/or more than 1 'TypeB'. (124, 125)

This is using SQL Server 2008.


SELECT DISTINCT user_id FROM table WHERE typecode = 'TypeA' OR typecode = 'TypeB' 
   GROUP BY user_id, typecode HAVING COUNT(typecode) > 1

I edited the query to take int to account that only TypeA or TypeB are of interest. Bum not exactly sure about this. This might return user two tiems if it hase 2 TypeA and 2 TypeB i.e.


This is a perfect use case for the union clause.

The query below returns all users ids that have more than 1 TypeA plus all users ids that have more than 1 TypeB.

-- all user_ids that have more than one TypeA
select user_id
  from yourTable
 where typecode = 'TypeA'
 group by user_id
having count(*) > 1
 union
-- all user_ids that have more than one TypeB
select user_id
  from yourTable
 where typecode = 'TypeB'
 group by user_id
having count(*) > 1

This query satisfies your and/or requirement, ie, it selects:

  • all users with more than 1 typeA or
  • all users with more than 1 typeB or
  • all users with more than 1 typeA and more than 1 typeB

The beauty of union is that there is no need make a select distinct user_id, since union merges the result sets into unique values


Try this:

SELECT *
  FROM
    (
        SELECT user_id, 
            SUM(CASE typecode WHEN  'TypeA' THEN 1 ELSE 0 END) TypeACount,
            SUM(CASE typecode WHEN  'TypeB' THEN 1 ELSE 0 END) TypeBCount
            FROM <YOUR-TABLE> a
        GROUP BY user_id
    ) a
WHERE a.TypeACount > 1  OR  a.TypeBCount > 1


select user_id
from YourTable
group by user_id
having count(case typecode when 'TypeA' then 1 end) > 1 or
       count(case typecode when 'TypeB' then 1 end) > 1


SELECT user_id  
FROM users  
GROUP BY user_id, typecode  
HAVING COUNT(id) > 1  


something like this maybe:

select user_id, count(typecode) as t_count
group by user_id
where t_count > 1
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜