如果两列满足特定条件,则SQL返回行

时间:2019-12-05 15:58:55

标签: sql sql-server case

我有一张表,需要根据是否满足某些条件来对行数进行计数。该表具有ID,级别和名称。级别可以是“ 1”或“ 2”,数字可以是“ AAA 100”(数字在100-199之间)或“ AAA 500”(数字在500-599之间)。一个ID可能与任一范围内的名称相关联,我想根据每个ID的级别是“ 1”还是“ 2”来计算该范围内的数量。

示例表:

a count

我需要做的是,如果“级别”列= 2,则仅返回数量大于或等于500的Name值计数。并且如果ID的“级别” = 1,则仅返回计数值名称值介于100-199之间或小于500。

所需的输出将是:

enter image description here

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

嗯。 。 。我在想您要每个ID排一行。如果是这样,您可以使用单个聚合和coalesce()来做到这一点:

select id,
       coalesce(sum(case when level = 2 and name >= 'AAA 500' then 1 end),
                sum(case when level = 1 and name < 'AAA 500' then 1 end)
               ) as cnt
from t
group by id;

如果您希望同时存在两个级别,则只需将level添加到group by

答案 1 :(得分:0)

假设“ AAA”可以是任何其他字母,并且每个id的层级不会超过一个:

declare @sample table(
   Id int,
   Level int,
   Name varchar(20)
)

insert into @sample values
(1, 2, 'AAA 100'),
(1, 2, 'AAA 111'),
(1, 2, 'AAA 500'),
(1, 2, 'AAA 505'),
(1, 2, 'AAA 550'),
(2, 1, 'AAA 100'),
(2, 1, 'AAA 111'),
(2, 1, 'AAA 500'),
(2, 1, 'AAA 505'),
(2, 1, 'AAA 550');

select id,
       sum(case when level = 2 and substring(name, 5, 3) >= '500' then 1
                when level = 1 and substring(name, 5, 3) < '500' then 1
                else 0
           end) count

from @sample
group by id;