2016-03-15 4 views
0

У меня есть сценарий, при котором accountNo не Primary Key и Повторяющиеся, и я хотел бы найти счета, которые имеют priority со значением '0'. Поле priority представляет собой тип данных varchar. В следующей таблице приведен пример:Нахождение конкретных значений в SQL

ID AccountNo Priority 
1 20   0 
2 22   0 
3 30   0 
4 20   1 
5 25   0 
6 22   0 

Я хочу, чтобы получить дубликаты или отдельные записи accounts, которые имеют priority значения '0' с условием, что другие дубликаты одного и того же accountNo не имеет никакого значения priority'1'. Например, accountNo 20 имеют 2 записи, но один с priority оценен '1', поэтому он не должен быть на выходе. Для accountNo 22, хотя есть 2 записи, но оба имеют значение priority значения '0', поэтому он рассматривается как один из результатов.

AccountNo 
    22 
    30 
    25 

Проблема я столкнулся в том, что я могу найти только счета с priority'0', но эти счета склонны к возможности иметь дубликат accountNo с priority значных '1'. Следующий код является то, что я реализовал:

SELECT AccountNo 
FROM CustTable 
WHERE PRIORITY = '0' 
GROUP BY AccountNo 

ответ

0

Если Priority поле принимает значения только в ('0', '1'), то попробуйте следующее:

SELECT AccountNo 
FROM CustTable 
GROUP BY AccountNo 
HAVING MAX(Priority) = '0' 

иначе вы можете использовать:

SELECT AccountNo 
FROM CustTable 
GROUP BY AccountNo 
HAVING COUNT(CASE WHEN Priority <> '0' THEN 1 END) = 0 
+0

Я думаю, что ваш второй запрос должен быть CASE КОГДА Приоритет = '1' .. – sagi

0

возвращающих AccountNo, если он имеет приоритет 0, но только если не существует никакой другой строки с тем же AccountNo, что имеет приоритет 1.

SELECT DISTINCT AccountNo 
FROM CustTable t1 
WHERE PRIORITY = '0' 
and not exists (select * FROM CustTable t2 
       where t1.AccountNo = t2.AccountNo 
        and t2.PRIORITY = '1') 
0

Это будет работать независимо от используемой РСУБД, поскольку не все из них принимают «группу за», не выбирая агрегированную функцию (например, Максимум()). Было бы лучше, если вы упомянете о РСУБД, которую вы используете, в будущем.

SELECT DISTINCT tmp.AccountNo 
FROM 
    (SELECT AccountNo, MAX(Priority) 
    FROM CustTable 
    GROUP BY AccountNo 
    HAVING MAX(Priority) = '0' 
    ) tmp 
Смежные вопросы