0

我有这个查询,我想删除 = 0 的结果。

declare @Teacher as nvarchar(50) ='Professor David'

select  'Science Class' as 'Study Type',
(select Count(Distinct StudentID) from Table_class_SClass where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'
union
select  'Science Lab' as 'Study Type',
(select Count(Distinct StudentID) from Table_class_SLab where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'
union
select  'Science Field' as 'Study Type',
(select Count(Distinct StudentID) from Table_class_field where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'

我想将其存储为存储过程,但我想消除没有老师声明为“大卫教授”的工会的结果。

显示的结果是:

Study Type        Number Of passing Students
Science Class     8
Science Lab       0
Science Field     1

所需的结果是:

Study Type        Number Of passing Students
Science Class     8
Science Field     1

如您所见,我想消除 Science Lab,因为通过的学生人数为 0。

4

4 回答 4

0

您可以将现有查询设为子查询。然后,您可以使用where子句进行过滤:

select t.*
from (select  'Science Class' as [Study Type],
              (select Count(Distinct StudentID) from Table_class_SClass where Grade = 'Passed' and Teacher= @Teacher) as [Number of Passing Students]
      union all
      select  'Science Lab' as 'Study Type',
              (select Count(Distinct StudentID) from Table_class_SLab where Grade = 'Passed' and Teacher= @Teacher) as [Number of Passing Students]
      union all
      select  'Science Field' as 'Study Type',
              (select Count(Distinct StudentID) from Table_class_field where Grade = 'Passed' and Teacher= @Teacher) as [Number of Passing Students]
     ) t
where [Number of Passing Students] > 0;

我也将其更改unionunion all. union all效率更高,因为它不会删除重复项,因此默认情况下使用它是一个好主意(除非您想删除重复项)。此外,我将列别名更改为使用方括号而不是单引号。仅对字符串常量使用单引号,而不对查询中的列名使用单引号。

于 2013-09-19T12:11:55.303 回答
0

您可以尝试在每个查询的末尾添加此行

group by teacher having count(Distinct StudentID) > 0

这将只返回计数超过 1 的记录

select  'Science Class' as [Study Type],
          (select Count(Distinct StudentID) from Table_class_SClass where Grade = 'Passed' and Teacher= @Teacher group by teacher having count(Distinct StudentID) > 0) as [Number of Passing Students]
union all
select  'Science Lab' as 'Study Type',
          (select Count(Distinct StudentID) from Table_class_SLab where Grade = 'Passed' and Teacher= @Teacher group by teacher having count(Distinct StudentID) > 0) as [Number of Passing Students]
union all
select  'Science Field' as 'Study Type',
          (select Count(Distinct StudentID) from Table_class_field where Grade = 'Passed' and Teacher= @Teacher group by teacher having count(Distinct StudentID) > 0) as [Number of Passing Students]
于 2013-09-19T12:11:57.723 回答
0

将其设为派生表并过滤掉返回多于 0 行的行。

 declare @Teacher as nvarchar(50) ='Professor David'

    select * from 
(    
        select  'Science Class' as 'Study Type',
        (select Count(Distinct StudentID) from Table_class_SClass where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'
        union
        select  'Science Lab' as 'Study Type',
        (select Count(Distinct StudentID) from Table_class_SLab where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'
        union
        select  'Science Field' as 'Study Type',
        (select Count(Distinct StudentID) from Table_class_field where Grade = 'Passed' and Teacher= @Teacher) as 'Number of Passing Students'
) 
as DT
Where DT.cnt > 0
于 2013-09-19T12:16:00.387 回答
0

HAVING 子句允许您根据聚合值过滤结果。

解决方案看起来像这样:

DECLARE @Teacher AS nvarchar(50) ='Professor David'

SELECT  'Science Class' as 'Study Type',
    COUNT(DISTINCT StudentID) as 'Number of Passing Students'
FROM    Table_class_SClass 
WHERE   Grade = 'Passed' 
AND Teacher= @Teacher
HAVING  COUNT(DISTINCT StudentID) > 0
UNION
SELECT  'Science Lab' as 'Study Type',
    COUNT(DISTINCT StudentID) as 'Number of Passing Students'
FROM    Table_class_SLab
WHERE   Grade = 'Passed' 
AND Teacher= @Teacher 
HAVING  COUNT(DISTINCT StudentID) > 0
UNION
SELECT  'Science Field' as 'Study Type',
    COUNT(DISTINCT StudentID) as 'Number of Passing Students'
FROM    Table_class_Politics
WHERE   Grade = 'Passed' 
AND Teacher= @Teacher
HAVING  COUNT(DISTINCT StudentID) > 0

作为一个小附录,尽管看起来您的数据库没有标准化,并且通过这种方式让您的查询变得更加困难。您可能想要研究数据库规范化并将一些概念应用于您自己的数据库。

于 2013-09-19T12:17:54.647 回答