Выберите строки на основе значений поля - PullRequest
2 голосов
/ 20 марта 2020

У меня есть эта структура

CREATE TABLE #Test
(
    Field1   VARCHAR(10),
    Field2   VARCHAR(10)
)

INSERT #Test VALUES('AAA','NO'),
                   ('BBB','NO'),
                   ('BBB','YES'),
                   ('BBB','SURE'),
                   ('CCC','NO'),
                   ('DDD','NO'),
                   ('DDD','YES'),
                   ('DDD','ALWAYS')

SELECT * FROM #Test 

Каждое отдельное значение Field1 имеет Field2 'НЕТ'. Я хочу выбрать все строки из #Test, чтобы при различном значении Field1 иметь несколько значений Field2, вернуть все, кроме строки с Field2 = 'NO', в противном случае вернуть значение 'NO'. Таким образом, результат должен быть следующим:

enter image description here

AAA имеет только «NO», поэтому мы возвращаем его, BBB имеет несколько, поэтому возвращаем все, кроме «NO».

Я хочу выделить его одним оператором без удаления и т. Д. c .. Я попытался ROW_NUMBER() разбить на Field1, но это не решило проблему.

Ответы [ 3 ]

1 голос
/ 20 марта 2020

С НЕ СУЩЕСТВУЮЩИМ:

SELECT * FROM #Test t
WHERE t.Field2 <> 'NO'
OR NOT EXISTS (SELECT 1 FROM #Test WHERE Field1 = t.Field1 AND Field2 <> 'NO')

См. Демоверсию . Результаты:

> Field1 | Field2
> :----- | :-----
> AAA    | NO    
> BBB    | YES   
> BBB    | SURE  
> CCC    | NO    
> DDD    | YES   
> DDD    | ALWAYS
0 голосов
/ 20 марта 2020

Вы можете использовать функцию окна:

SELECT t.Field1, t.Field2 
FROM (SELECT t.*, 
             SUM(CASE WHEN FIELD2 = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY FIELD1) AS NO_FLAG,
             COUNT(*) OVER (PARTITION BY FIELD1) AS CNT
      FROM Test t
      ) t
WHERE (CNT <> NO_FLAG AND FIELD2 <> 'NO') OR
      (CNT = NO_FLAG AND FIELD2 = 'NO');

Здесь демо .

0 голосов
/ 20 марта 2020

Надеюсь, этот пример вам поможет.

select Field1,Field2 from #Test where Field1 not in(SELECT Field1 FROM #Test where Field2<>'NO')
UNION ALL
SELECT Field1,Field2 FROM #Test where Field2<>'NO'
order by Field1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...