Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法对包含聚合或子查询的表达式执行聚合函数。SQL Server_Sql - Fatal编程技术网

无法对包含聚合或子查询的表达式执行聚合函数。SQL Server

无法对包含聚合或子查询的表达式执行聚合函数。SQL Server,sql,Sql,我们在表Employee中找到了一些记录。不同的学生与特定的ClassId链接。在屏幕截图中,StudentId5,6属于ClassId1,而StudentId5,6,7属于另一个ClassId2 我想从上面只包含StudentId5和6的表中获取ClassId。因此,在上面的示例中,它应该返回ClassId1。棘手的是,值5和6来自另一个表 所以当我在下面运行查询时,它会抛出一个错误 SELECT ClassId FROM employee GROUP BY ClassId HAVING C

我们在表
Employee
中找到了一些记录。不同的
学生
与特定的
ClassId
链接。在屏幕截图中,
StudentId
5,6属于
ClassId
1,而
StudentId
5,6,7属于另一个
ClassId
2

我想从上面只包含
StudentId
5和6的表中获取
ClassId
。因此,在上面的示例中,它应该返回
ClassId
1。棘手的是,值5和6来自另一个表

所以当我在下面运行查询时,它会抛出一个错误

SELECT ClassId
FROM employee
GROUP BY ClassId
HAVING COUNT(CASE WHEN StudentId NOT IN (select id from test) THEN 1 END) = 0;
错误:

无法对包含聚合或子查询的表达式执行聚合函数

如果我删除子查询部分,那么它可以正常工作

SELECT ClassId
FROM employee
GROUP BY ClassId
HAVING COUNT(CASE WHEN StudentId NOT IN (5,6) THEN 1 END) = 0;
下面是上面两个表的创建表脚本

CREATE TABLE Student (Id INT) 
INSERT INTO Student VALUES (5),(6)

CREATE TABLE Employee
(
     Id INT IDENTITY, 
     ClassId INT, 
     StudentId INT
)

INSERT INTO employee 
VALUES (1, 5), (1, 6), (2, 5), (2, 6), (2, 7)

有人能建议一种解决方法来运行第一个查询而不出错吗?

使用
groupby
如下所示:

SELECT e.ClassId
FROM employee e LEFT JOIN
     test t
     ON t.StudentId = e.id
GROUP BY e.ClassId
HAVING COUNT(*) = COUNT(t.StudentId) AND      -- all rows in `e` match a row in `t`
       COUNT(*) = (SELECT COUNT(*) FROM test) -- all match

这是不允许的,但您可以执行
左联接
。然后使用
coalesce()
检查
test
表中没有的项目

select t1.ClassId 
from employee t1
left join test t2 on t2.id = t1.StudentId
group by t1.ClassId
having count(case when coalesce(t2.id, 0) = 0 then 1 end)= 0

您可以使用apply来简化HAVING
子句

declare @Student table (ID int) ; 
insert into @Student values (5),(6) ;
declare @employee table (ID int identity, ClassId int, StudentId int)  ; 
insert into @employee values (1,5),(1,6), (2,5),(2,6), (2,7) ; 


SELECT e.ClassId  AS ClassId , COUNT(e.StudentId)  
FROM @employee AS e 
CROSS APPLY ( 
    SELECT ID
    FROM @Student AS s
    WHERE s.ID = e.StudentId 
) AS student 
GROUP BY e.ClassId 
HAVING COUNT(e.StudentId) = (SELECT COUNT('8') FROM @Student) ;

非常感谢您在这方面提供的解决方案。两个答案都有效,所以我们有两种不同的方法来解决这个问题。这就是我需要的。