Выберите столбец DISTINCT в условии DISTINCT - PullRequest
0 голосов
/ 31 мая 2018

Я хочу выбрать различные значения из 'num', когда его статус только 'YES', не считая 'NO' сразу?

Таблица:

+--------+-----+--------+
| id     | num | status |
+--------+-----+--------+
| 364519 | AAA | YES    |
| 364522 | BBB | YES    |
| 364525 | AAA | NO     |
| 364527 | CCC | YES    |
| 364530 | DDD | YES    |
| 364532 | EEE | YES    |
| 364535 | FFF | YES    |
| 364537 | DDD | YES    |
| 364538 | DDD | NO     |
| 364539 | FFF | NO     |
+--------+-----+--------+

Необходим Результат:

+--------+-----+--------+
| id     | num | status |
+--------+-----+--------+
| 364522 | BBB | YES    |
| 364527 | CCC | YES    |
| 364532 | EEE | YES    |
+--------+-----+--------+

Ответы [ 5 ]

0 голосов
/ 31 мая 2018

Я бы просто использовал group by cluase:

select min(id) as id, num, 'YES' as status
from table t
group by num
having min(status) = max(status) and min(status) = 'YES'; 
0 голосов
/ 31 мая 2018

выберите отдельный (номер), идентификатор, статус из таблицы, где статус = 'ДА'

0 голосов
SELECT * FROM table
WHERE status='YES' AND num NOT IN (SELECT num FROM table WHERE status='NO')

Или это

SELECT * FROM table t
WHERE t.status='YES' AND NOT EXISTS (SELECT * FROM table WHERE status='NO' AND num=t.num)
0 голосов
/ 31 мая 2018

Просто пара других подходов.(кажется, самое чистое)

Разделите данные на два набора и убедитесь, что в наборе «A» нет данных в наборе «B». Первый подход с использованием внешнего соединения возвращает только записи в наборе «A», гдев наборе «B» не найдено ни одного связанного числа.

SELECT Min(A.ID) as ID, A.num, A.status
FROM table A
LEFT JOIN table B
  on A.Num = B.Num
 and B.Status = 'NO'
WHERE A.Status = 'YES'
  and B.Num is null
GROUP BY A.Num, A.Status

Второй подход с использованием not not.аналогично только num записей в наборе «A», а не в наборе «B».

SELECT min(A.ID) as ID, A.Num, A.Status
FROM table A
WHERE NOT EXISTS (SELECT 1 
                  FROM Table B
                  WHERE A.Num = B.Num
                    and B.Status = 'NO')
GROUP BY A.Num, A.Status
0 голосов
/ 31 мая 2018

Вы можете использовать HAVING:

SELECT MIN(id) AS id, num,'yes' AS status
FROM tab
GROUP BY num
HAVING SUM(status='NO') = 0;

DBFiddle Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...