Фильтровать строки по разделам - PullRequest
0 голосов
/ 28 мая 2019

Предположим, у меня есть следующая таблица:

    +-------+------------+
    | nGroup |   Status   |
    +-------+------------+
    |     1 | DONE       |
    |     1 | UNKNOWN    |
    |     1 | DONE       |
    |     2 | INPROGRESS |
    |     2 | INPROGRESS |
    |     2 | DONE       |
    |     3 | INPROGRESS |
    |     3 | DONE       |
    |     3 | DONE       |
    +-------+------------+

Если nGroup имеет одно значение Status to INPROGRESS , то возвращаются только строки этой группы, содержащие статус INPROGRESS .

Если все Статус nGroup отличаются от INPROGRESS , вернуть все состояния, доступные для этой группы.

Так что для этого примера я бы получил следующий вывод:

+-------+------------+
| nGroup |   Status   |
+-------+------------+
|     1 | DONE       |
|     1 | UNKNOWN    |
|     1 | DONE       |
|     2 | INPROGRESS |
|     2 | INPROGRESS |
|     3 | INPROGRESS |
+-------+------------+

Я попробовал следующий запрос:

SELECT *
FROM dbo.myTable T1 
WHERE Status IN (
  CASE WHEN EXISTS( SELECT 1 FROM myTable T2 WHERE T2.STATUS = 'INPROGRESS' AND T1.nGroup = T2.nGroup) THEN 'INPROGRESS'
  ELSE (SELECT Status FROM myTable T2 WHERE T1.nGroup = T2.nGroup) 
  END
)

Но я получаю следующую ошибку при запуске:

Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется как выражение.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Это сделает это:

select m.*
from myTable m
where 
  m.Status = 'INPROGRESS' 
  OR NOT EXISTS (
    select 1 from myTable where nGroup = m.nGroup and Status = 'INPROGRESS'
  )
0 голосов
/ 28 мая 2019

Хммм. , , Я думаю, что вы хотите:

select t.*
from dbo.myTable t
where t.status <> 'INPROGRESS' or
      exists (select 1
              from dbo.myTable t
              where db.myTable = 'INPROGRESS'
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...