2014-09-29 4 views
2

не мог придумать лучшее название для этого вопроса в настоящее время, но вот пример набора данных Я работаю с:SQL группа запросов по с несколькими условиями

Token         Buyer   Amount 
--------------------------------------------------------------- 
F3D4A490-03C9-450E-873B-3B70E68FA65B Company B  1.50 
F3D4A490-03C9-450E-873B-3B70E68FA65B Company C  0.99 
A85677D8-C5A9-4766-8628-AADD769240C2 Company A  3.14 
A85677D8-C5A9-4766-8628-AADD769240C2 Company B  2.44 
FB72BEE1-194C-48D3-8EC1-669776E8924C Company C  2.01 
E9FFACBF-F9B1-4278-B49D-42E605F21D28 Company B  1.25 

Мне нужно, чтобы получить список значений токена, которые соответствуют одному из двух следующих условий:

  • В наборе данных имеется только один из этих тонетов.
  • Существует не один из этих конкретных токенов, но ни один из значений «Покупатель» не является «Компанией A».

В этом случае, мой желаемый набор результатов будет содержать следующее:

F3D4A490-03C9-450E-873B-3B70E68FA65B 
FB72BEE1-194C-48D3-8EC1-669776E8924C 
E9FFACBF-F9B1-4278-B49D-42E605F21D28 

Получение списка основанный на наличии одного маркера достаточно легко. Я могу сделать GROUP BY с HAVING COUNT (*) = 1. Это второе условие, которое дает мне некоторые проблемы.

Производительность не является соображением для этого решения, это одноразовый запрос, который я буду запускать.

+1

Поскольку это ad-hoc, просто напишите 2 запроса и СОЕДИНИТЕ их вместе – DavidG

ответ

4
SELECT Token 
FROM TableName 
GROUP BY Token 
HAVING COUNT(*) = 1 

UNION ALL 

SELECT Token 
FROM TableName 
WHERE Token NOT IN 
     (
      SELECT Token 
      FROM TableName 
      WHERE Buyer = 'Company A' 
     ) 
GROUP BY Token 
HAVING COUNT(*) > 1 
Смежные вопросы