不同行上的多条件

vltsax25  于 2021-07-29  发布在  Java
关注(0)|答案(5)|浏览(413)
age | name     | course | score
_________________________
10  |James    | Math   | 10
10  |James    | Lab    | 15
12  |Oliver   | Math   | 15
13  |William  | Lab    | 13

我想选择记录,其中数学>=10和实验室>11我写这个查询

select * from mytable
where (course='Math' and score>10) and  (course='Lab' and score>11)

但是这个查询不返回任何记录。
我想要这个结果

age | name     
____________
10  |James

其中条件(math>=10和lab>11)是动态生成的,可能有2个或100个以上的条件。。。
请帮帮我

wnvonmuf

wnvonmuf1#

如果需要名称,请使用聚合和having子句:

select name, age
from mytable
where (course = 'Math' and score > 10) or
      (course = 'Lab' and score > 11) 
group by name, age
having count(distinct course) = 2;

如果需要详细记录,请使用窗口函数:

select t.*
from (select t.*,
             (dense_rank() over (partition by name, age order by course asc) +
              dense_rank() over (partition by name, age order by course desc)
             ) as cnt_unique_courses
      from mytable t
      where (course = 'Math' and score > 10) or
            (course = 'Lab' and score > 11) 
     ) t
where cnt_unique_courses = 2;

sql server不支持 count(distinct) 作为一个窗口函数。但是你可以用 dense_rank() 两次。

91zkwejq

91zkwejq2#

您可以查询同时满足这两个条件的记录—这是不可能的,因为每个记录都有一个课程。
您需要一个适用于具有相同名称的行的条件,因此建议改为聚合:

select age, name 
from mytable
where course in ('Math', 'Lab')
group by age, name 
having
    max(case when course = 'Math' then score end) > 10
    and max(case when course = 'Lab' then score end) > 11
ddhy6vgd

ddhy6vgd3#

如果您将问题表述为:
选择所有唯一的(姓名、年龄)组合
有一行分数>=10的课程数学
有一排分数大于11的课程实验室
然后您可以将其转换为sql中非常类似的内容:

select distinct t1.age, t1.name            -- unique combinations
from mytable t1
where exists ( select top 1 'x'            -- with a row math score >= 10
               from mytable t2
               where t2.name = t1.name
                 and t2.age = t1.age
                 and t2.course = 'math'
                 and t2.score >= 10 )
  and exists ( select top 1 'x'            -- with a row lab score > 11
               from mytable t3
               where t3.name = t1.name
                 and t3.age = t1.age
                 and t3.course = 'lab'
                 and t3.score > 11 );
8mmmxcuj

8mmmxcuj4#

我认为要么你的数据要么你的条件不适合你的输出。尽管基于您的条件,您可以单独使用您的条件,然后从两个选择中使用intersect并获取过滤后的数据。就像下面的代码。

select Age,Name
from Table_1
where Course ='Math' and Score>=10
INTERSECT
select Age,Name
from Table_1
where Course ='Lab' and Score>11
kt06eoxx

kt06eoxx5#

您可以使用共相关子查询编写查询

select * from table_1 t1
    where score >11 and course ='lab' 
        and [name] in (select [name] from table_1 t2 where t1.[name] =t2.[name] and t1.age =t2.Age
        and t2.Score >=10 and course = 'Math')

相关问题