Как вернуть строки, где есть более одного типа? - PullRequest
1 голос
/ 15 июня 2011

У меня есть следующие данные:

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'

Мне нужен запрос, который будет возвращать user_ids для пользователей, которые имеют более 1 'TYPEA' и / или более 1 'TypeB'.(124, 125)

Используется SQL Server 2008.

Ответы [ 6 ]

3 голосов
/ 15 июня 2011

Это идеальный вариант использования предложения union.

Приведенный ниже запрос возвращает все идентификаторы пользователей, которые имеют более 1 TypeA плюс все идентификаторы пользователей, которые имеют более 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

Этот запрос удовлетворяет вашему требованию and/or, т.е. он выбирает:

  • все пользователи с более чем 1 typeA или
  • все пользователи с более чем 1 typeB или
  • все пользователи с более чем 1 типом А и более чем 1 типB

Прелесть union в том, что нет необходимости делать select distinct user_id, поскольку union объединяет результирующие наборы в уникальные значения

3 голосов
/ 15 июня 2011
SELECT DISTINCT user_id FROM table WHERE typecode = 'TypeA' OR typecode = 'TypeB' 
   GROUP BY user_id, typecode HAVING COUNT(typecode) > 1

Я отредактировал запрос, чтобы учесть int, что интерес представляют только TypeA или TypeB.Бум не совсем уверен в этом.Это может вернуть пользователю два тайма, если он имеет 2 TypeA и 2 TypeB, т.е.

1 голос
/ 16 июня 2011
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
1 голос
/ 15 июня 2011

Попробуйте это:

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
0 голосов
/ 15 июня 2011
SELECT user_id  
FROM users  
GROUP BY user_id, typecode  
HAVING COUNT(id) > 1  
0 голосов
/ 15 июня 2011

что-то вроде этого может быть:

select user_id, count(typecode) as t_count
group by user_id
where t_count > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...