Sql 根据列的总和统计不同的ID

Sql 根据列的总和统计不同的ID,sql,azure-sql-database,Sql,Azure Sql Database,我觉得这应该是非常简单的,但我不能让我的头脑围绕它,我很感激任何关于以下方面的建议(我已经简化了,把重点放在我不能做的事情上)。我正在使用Azure SQL 我有一个结果表(称为testanswers),如下所示: id | PupilId | NumMark ---------------------- 1 | 10 | 1 2 | 20 | 2 3 | 10 | 2 4 | 20 | 0 5 | 10 | 1 6 | 20

我觉得这应该是非常简单的,但我不能让我的头脑围绕它,我很感激任何关于以下方面的建议(我已经简化了,把重点放在我不能做的事情上)。我正在使用Azure SQL

我有一个结果表(称为testanswers),如下所示:

id | PupilId | NumMark
----------------------
1  | 10      | 1
2  | 20      | 2
3  | 10      | 2
4  | 20      | 0
5  | 10      | 1
6  | 20      | 2
我想数一数在两个边界之间取得若干分数的学生人数(即不同的学童)

我试过:

SELECT COUNT(DISTINCT PupilId)
FROM testanswers
WHERE SUM(NumMark) >= 2 AND SUM(NumMark) <= 5
选择计数(不同的PupilId)
来自testanswers
其中SUM(NumMark)>=2,SUM(NumMark)试试这个

SELECT COUNT(DISTINCT PupilId)
FROM testanswers
Group by PupilId Having SUM(NumMark) >= 2 AND SUM(NumMark) <= 5
选择计数(不同的PupilId)
来自testanswers
按学生分组,其总和(NumMark)>=2,总和(NumMark)见数据

试着分组

SELECT  PupilId
FROM testanswers
group by PupilId
having SUM(NumMark) >= 2 AND SUM(NumMark) <= 5 
选择PupilId
来自testanswers
按蛹分组

让SUM(NumMark)>=2和SUM(NumMark)try
GROUP BY

SELECT SUM(NumMark),COUNT(DISTINCT PupilId)
FROM testanswers
GROUP BY SUM(NumMark)
HAVING SUM(NumMark) >= 2 AND SUM(NumMark) <= 5
SELECT SUM(NumMark)、COUNT(DISTINCT PupilId)
来自testanswers
按总和分组(NumMark)
让SUM(NumMark)>=2和SUM(NumMark)为每个学生查找
SUM(NumMark)
,您必须
按学生ID分组:

SELECT PupilId, SUM(NumMark)
FROM testanswers
GROUP BY PupilId ;
然后,要仅保留此总和介于
2
5
之间的行,可以使用
HAVING

SELECT PupilId, SUM(NumMark)
FROM testanswers
GROUP BY PupilId 
HAVING SUM(NumMark) >= 2 AND SUM(NumMark) <= 5 ;

这也适用于SQL Server,但不确定Azure版本:

SELECT DISTINCT COUNT(*) OVER () AS result
FROM testanswers
GROUP BY PupilId 
HAVING SUM(NumMark) BETWEEN 2 AND 5  ;

进行测试,不会产生相同的错误吗?它仍然在WHERE子句中使用聚合函数,而不是子查询。通过复制您的示例并将|替换为,然后使用其向导文本创建表格DDL@tgkprog您还可以使用“文本到DDL”功能!(请注意,问题是关于Azure的,它是SQL Server的一个版本,而不是MySQL。)我不认为有任何区别——GROUPBY是ansi SQL的一部分。受所有RDBMS支持。你之前做对了,我通过stamps看到了,数据库也做对了,所以投票u:)也许问的问题也会把它标记为答案。谢谢你非常完整的解释
SELECT DISTINCT COUNT(*) OVER () AS result
FROM testanswers
GROUP BY PupilId 
HAVING SUM(NumMark) BETWEEN 2 AND 5  ;
SELECT COUNT(PupilId) AS NUMBEROFPUPILS
FROM (SELECT PupilId FROM testanswers GROUP BY PupilId HAVING SUM(NumMark) BETWEEN 2 AND 5) AS TEMP;