SQL Server或其中的条件的功能

时间:2017-07-11 14:15:48

标签: sql-server

我有一个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

3 个答案:

答案 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];