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