Sql 根据字段值选择行

Sql 根据字段值选择行,sql,sql-server,tsql,sql-server-2017,Sql,Sql Server,Tsql,Sql Server 2017,我有这个结构 CREATE TABLE #Test ( Field1 VARCHAR(10), Field2 VARCHAR(10) ) INSERT #Test VALUES('AAA','NO'), ('BBB','NO'), ('BBB','YES'), ('BBB','SURE'), ('CCC','NO'),

我有这个结构

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“否”。 我想从测试中选择所有行,这样,如果不同的Field1值有多个Field2值,则返回除Field2='NO'行之外的所有内容,否则返回'NO'值。 所以结果应该是这样的

AAA只有“否”,所以我们返回它,BBB有多个,所以返回除“否”之外的所有内容

我想在一条语句中选择它,而不删除它,等等。。我尝试了按Field1分区的行编号,但这并不能解决问题。

不存在:

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

我希望这个例子能帮助你

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

您可以使用窗口功能:

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');
这是

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');