我有一个SQL查询,我希望获得值为"所有"的行。或者"女性"在[性别]栏和价值" A"在[group]栏中。如果有2行[group] = A且[gender] = all而另一[group] = A且[gender] = female,我想只获得[gender] = all的行。现在我用:
where group=A and (gender=all or gender=female)
但我得到两行
在下面的示例表中,我想只获取行:A all
但如果我使用where group=A and (gender=all or gender=female)
查询,我将获得A组的两行
群组性别
A all
A female
B all
C female
C all
答案 0 :(得分:0)
您可以使用row_number()
之类的内容来确定您正在查看的各种记录子集的优先级,然后从每个记录中只选择一条记录。根据你问题的措辞,我假设表格中有一些其他字段,你将记录“分组”在一起 - 换句话说,一个字段的每个不同的值最多应该在结果集中产生一个记录{{{ 1}}和group
值符合您的条件。在下面的例子中,我假设这个字段被称为gender
;如果您分享表格的实际架构,那么我可以改进示例,但这足以说明这个想法。
Category
答案 1 :(得分:0)
您可以使用RANK()
窗口函数,其结果按group
分组,并按gender
排序(这可行,因为all
按字母顺序排在female
之前或{ {1}}。如果您的订购比这更复杂,您将不得不考虑另一种订购方式。
male
答案 2 :(得分:0)
数据脚本
declare @data table ([group] char(1), [gender] varchar(16));
insert into @data values ('A', 'all'), ('A', 'female') ,('B', 'all') ,('C', 'female') ,('C', 'all');
查询
select
[group] = [d].[group]
,[gender] = [x].[gender]
from
@data as [d]
cross apply
(
select top 1 [gender] from @data where [group] = [d].[group] order by iif([gender] = 'all', 0, 1) asc
) as [x]
group by
[d].[group]
,[x].[gender];