在MS SQL Server中尝试使用其他字段时,如何根据一个字段计算表中的行数?

在MS SQL Server中尝试使用其他字段时,如何根据一个字段计算表中的行数?,sql,sql-server,select,Sql,Sql Server,Select,我有3个连接的表,我想写一个查询,从这些连接的表中返回一些字段。 我需要检查一个条件,即只针对一个用户的行数。 为了更加精确和清晰,我的表格如下所示: tblTest ------------------------------ TestID | StudentID | TestType ------------------------------ tblTestType --------------------------- TestType | TestName -----------

我有3个连接的表,我想写一个查询,从这些连接的表中返回一些字段。 我需要检查一个条件,即只针对一个用户的行数。
为了更加精确和清晰,我的表格如下所示:

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计算机编程我这样做是为了防止我决定将名称更改为其他名称,从而省去了更改我的代码中硬编码的名称。