在MS SQL Server中尝试使用其他字段时,如何根据一个字段计算表中的行数?
我有3个连接的表,我想写一个查询,从这些连接的表中返回一些字段。 我需要检查一个条件,即只针对一个用户的行数。在MS SQL Server中尝试使用其他字段时,如何根据一个字段计算表中的行数?,sql,sql-server,select,Sql,Sql Server,Select,我有3个连接的表,我想写一个查询,从这些连接的表中返回一些字段。 我需要检查一个条件,即只针对一个用户的行数。 为了更加精确和清晰,我的表格如下所示: tblTest ------------------------------ TestID | StudentID | TestType ------------------------------ tblTestType --------------------------- TestType | TestName -----------
为了更加精确和清晰,我的表格如下所示:
tblTest
------------------------------
TestID | StudentID | TestType
------------------------------
tblTestType
---------------------------
TestType | TestName
---------------------------
tblStudents
-------------------------------
StudentID | StudentName | Sex
-------------------------------
我试图获取第一次通过考试的学生列表(因此“tblTest”生成的行数应等于1,以表明用户刚刚参加了考试并通过了考试,任何超过该值的数字都表示该学生参加了不止一次的考试),
我的查询如下所示:
SELECT tblStudents.StudentName, COUNT(tblTest.StudentID) AS [Number of Times Exame is Taken], tblTest.TestID
FROM tblTest INNER JOIN
tblTestType ON tblTest.TestID = tblTestType.TestType INNER JOIN
tblStudents ON tblTest.StudentID =tblStudents.StudentID
GROUP BY tblTest.StudentID, tblTest.TestID
HAVING (tblTest.TestID = 1)
它失败了。有人能告诉我正确的方法吗?试试这个:
SELECT
tblStudents.StudentName,
COUNT(tblTest.StudentID) AS [Number of Times Exame is Taken],
MIN(tblTest.TestID) AS TestID
FROM
tblTest
INNER JOIN tblTestType ON tblTest.TestID = tblTestType.TestType
INNER JOIN tblStudents ON tblTest.StudentID =tblStudents.StudentID
GROUP BY tblStudents.StudentName
HAVING COUNT(*) = 1
select * from tblTestType T
join
(SELECT tblStudents.StudentID,
COUNT(*) AS [Number of Times Exame is Taken],
tblTest.TestID
FROM tblTest
GROUP BY tblTest.StudentID, tblTest.TestID
HAVING COUNT(*)=1 )a
ON a.TestID = T.TestType
INNER JOIN tblStudents
ON a.StudentID =T.StudentID
试试这个:
select * from tblTestType T
join
(SELECT tblStudents.StudentID,
COUNT(*) AS [Number of Times Exame is Taken],
tblTest.TestID
FROM tblTest
GROUP BY tblTest.StudentID, tblTest.TestID
HAVING COUNT(*)=1 )a
ON a.TestID = T.TestType
INNER JOIN tblStudents
ON a.StudentID =T.StudentID
也许这就是你想要的
WITH cteTest AS (
SELECT COUNT(TestID) TakenCount, StudentID, TestType
FROM tblTest
GROUP BY StudentID, TestType
)
SELECT
s.StudentName,
tt.TestName
FROM cteTest t
INNER JOIN tblTestType tt ON t.TestType = tt.TestType
INNER JOIN tblStudents s ON t.StudentID = s.StudentID
WHERE t.TakenCount = 1;
也许这就是你想要的
WITH cteTest AS (
SELECT COUNT(TestID) TakenCount, StudentID, TestType
FROM tblTest
GROUP BY StudentID, TestType
)
SELECT
s.StudentName,
tt.TestName
FROM cteTest t
INNER JOIN tblTestType tt ON t.TestType = tt.TestType
INNER JOIN tblStudents s ON t.StudentID = s.StudentID
WHERE t.TakenCount = 1;
我不明白
TestID
和TestType
是什么-为什么你加入tblTest.TestID=tblTestType.TestType
而不是tblTest.TestType=tblTestType.TestType
?是否存在关系?如果是,那么tblTest.TestType
有什么好处?我正在使用Visual Studio内置查询设计器,我选择了列并创建了连接语句。TestType是表示考试的id,例如,我们可以有这样一个列表:TestType TestName 1计算机算法2计算机编程我这样做是为了防止我决定将名称更改为其他名称,从而省去了更改代码中的硬编码名称。我不知道TestID
和TestType
是什么-为什么您要在tblTest.TestID=tblTestType.TestType
上加入而不是在tblTest.TestType=tblTestType.TestType
上加入?是否存在关系?如果是,那么tblTest.TestType
有什么好处?我正在使用Visual Studio内置查询设计器,我选择了列并创建了连接语句。TestType是表示考试的id,例如,我们可以有这样一个列表:TestType TestName 1计算机算法2计算机编程我这样做是为了防止我决定将名称更改为其他名称,从而省去了更改我的代码中硬编码的名称。