如何在选择查询中不显示项目?

时间:2019-07-17 15:56:33

标签: sql ssms

我问这个问题有点愚蠢,因为我觉得这很容易,但是由于某些原因,我无法更新查询以不基于两个条件选择特定项目。

假设我有这样的数据:

 ID       Name       Variant     Count1
 110      Bob        Type1       0
 110      Bob        Type2       1
 120      John       Type1       1

因此,如您所见,我们有两个BOB行,它们的ID相同,但变量不同(类型1和类型2)。我希望只能看到鲍勃的其中一个。

所需结果:

 110      Bob        Type2
 120      John       Type1

所以我一直在做类似的事情

 Select ID, Name, Variant, sum(count1) from tbl1
 where (id not in (110) and Variant <> 'type1')
 Group by Id,name,variant

请不要使用COUNT作为条件,因为在我的示例中,恰恰是我不想看到的行的Count = 0。可能会有所不同。

我有很多行,在这些行中,我可以具有多个具有不同VARIANTS的相同ID的多个实例。我希望根据Variant值排除ID的某些实例

更新:

它与最新变体无关,与特定变体有关。所以我只是希望基本上能够使用我使用ID和VARIANT的子句来删除该特定行。

3 个答案:

答案 0 :(得分:2)

像执行操作一样对数据进行汇总(分组)是一种处理方法,尽管where条件有些过分。如果您只想查看ID和Name的唯一组合,那么另一种方法就是使用“ distinct”语句。

select distinct Id, Name 
from tbl1

如果您始终希望查看特定变体中的数据,则只需将该条件包括在where子句中,就不必担心使用不重复或汇总。

select * 
from tbl1
where Variant = 'Type 1'

如果您始终想查看与最新版本有关的记录,则可以使用窗口功能来查看。

select a.Id, a.Name, a.Variant
from 
    (
        select *, row_number() over (partition by Id order by Variant desc) as RowRank
        from tbl1
    ) a
where RowRank = 1
;

如果没有可预测的排除模式,则必须维护一个排除列表。这不是理想的方法,但是如果您想在SQL本身中维护它,则可以进行如下查询。

select *
from tbl1
-- Define rows to exlcude
where not (Id = 110 and Variant = 'Type 1') -- Your example
and not (Id = 110 and Variant = 'Type 3') -- Theoretical example
;

更好的解决方案是创建一个排除参考表,以维护其中的所有排除。然后,您可以简单地否定联接到该表以检索所需的结果。

答案 1 :(得分:2)

您是否考虑过使用排除表,可以在其中放置要排除的ID和变体组合? (在此示例中,我仅使用了临时表,您可以始终使用用户表,因此排除表将始终可用)

以下是根据您的示例我的意思的示例:

if object_id('tempdb..#temp') is not null
    drop table #temp

create table #temp (
     ID int,      
     Name  varchar(20),
     Variant varchar(20),
     Count1 int 
)

if object_id('tempdb..#tempExclude') is not null
    drop table #tempExclude

create table #tempExclude (
     ID int,      
     Variant varchar(20)

)

insert into #temp values 
    (110,'Bob','Type1',0),
    (110,'Bob','Type2',1),
    (120,'John','Type1',1),
    (120,'John','Type2',1),
    (120,'John','Type2',1),
    (120,'John','Type2',1),
    (120,'John','Type3',1)

insert into #tempExclude values (110,'Type1')

select
    t.ID,
    t.Name
    ,t.Variant
    ,sum(t.Count1) as TotalCount
from
    #temp t

    left join
    #tempExclude te
        on t.ID = te.ID
            and t.Variant = te.Variant
where
    te.id is null
group by
    t.ID,
    t.Name
    ,t.Variant

以下是结果:

enter image description here

答案 2 :(得分:1)

我认为您想要的逻辑是这样的:

Select ID, Name, Variant, sum(count1)
from tbl1
where not (id = 110 and variant = 'type1')
Group by Id, name, variant;

对于第二种情况,只需继续添加:

where not (id = 110 and variant = 'type1') and
      not (id = 314 and variant = 'popsicle')

您也可以使用排除列表来表达这一点:

select t.ID, Name, t.Variant, sum(t.count1)
from tbl1 t left join
     (values (111, 'type1'),
             (314, 'popsicle')
     ) v(id, excluded_variant)
     on t.id = v.id and
        t.variant = v.excluded_variant
where v.id is not null  -- doesn't match an exclusion criterion
group by Id, name, variant;