如何根据 SQL 中的特定列使用 'Count'

How to use 'Count', based on a particular column in SQL

我有一个查询,它给出的计数大于 1,但我期望的是我需要基于特定列 (Rollno) 的结果。如何实现它。

Table 研究

   NAME            RollNo        DeptType      InternalStaff_1     InternalStaff_2
-----------     -----------     -----------    ---------------     --------------- 
   Anu              5            CompSci        Eve                  Antony
   Joy             13            Architecture   Elizabeth            George
   Adam             2            Mech           Grady                Lisa 
   Adam             2            Mech           Grady                Kim
   Anu              5            CompSci        Eve                  Antony

下面的查询给了我 Count 但不是预期的

SELECT DISTINCT S.Name
, S.RollNo
, COUNT(S.RollNo) AS [Count]
, S.DeptType
, S.InternalStaff_1
, S.InternalStaff_2
FROM DataMining.dbo.Studies S
WHERE StartDate >= '20210325'--@StartDate
AND StartDate <= '20210407'--@EndDate
GROUP BY S.Name, S.RollNo, S.DeptType, S.InternalStaff_1, S.InternalStaff_2
HAVING COUNT(S.RollNo) > 1
ORDER BY RollNo

查询给了我以下结果

  NAME            RollNo          Count         DeptType      InternalStaff_1     InternalStaff_2
-----------     -----------     -----------    -----------    ---------------     --------------- 
   Anu              5              2            CompSci        Eve                  Antony

但预期的结果是

  NAME            RollNo          Count         DeptType      InternalStaff_1     InternalStaff_2
-----------     -----------     -----------    -----------    ---------------     --------------- 
   Anu              5              2            CompSci        Eve                  Antony
   Adam             2              2            Mech           Grady                NULL

如您所见,预期结果中 Adam 的 InternalStaff_2 名称不同,当前结果并未考虑该名称。

我可以知道如何克服这个吗?

注意:我需要根据Rollno显示结果,但我还需要将InternalStaff_2包含在结果中。

像这样? 我不确认你的需求,但是 internalstaff_2 列可以参考 STRING_AGG() 替换下面脚本中的嵌套子查询。

SELECT DISTINCT S.Name
       , S.RollNo
       , COUNT(S.RollNo) AS [Count]
       , S.DeptType
       , S.InternalStaff_1
       , (SELECT CASE WHEN COUNT(DISTINCT InternalStaff_2) = 1 THEN MIN(InternalStaff_2) ELSE null END
          FROM #temp AS i
          WHERE i.NAME = S.NAME and i.RollNo = S.RollNo and i.DeptType = S.DeptType and i.InternalStaff_1 = S.InternalStaff_1) as InternalStaff_2
FROM #temp S
GROUP BY S.[Name], S.RollNo, S.DeptType, S.InternalStaff_1
HAVING COUNT(S.RollNo) > 1
ORDER BY RollNo

嗯。 . .如果我理解正确,如果内部人员列不匹配,您需要 NULL。那将是:

SELECT S.Name, S.RollNo, COUNT(*) AS [Count], S.DeptType,
       (CASE WHEN MIN(S.InternalStaff_1) = MAX(S.InternalStaff_1) THEN MIN(S.InternalStaff_1) END) as InternalStaff_1,
       (CASE WHEN MIN(S.InternalStaff_2) = MAX(S.InternalStaff_2) THEN MIN(S.InternalStaff_2) END) as InternalStaff_2
FROM DataMining.dbo.Studies S
WHERE StartDate >= '20210325' AND --@StartDate
      StartDate <= '20210407'     --@EndDate
GROUP BY S.Name, S.RollNo, S.DeptType
HAVING COUNT(*) > 1
ORDER BY RollNo;

Here 是一个 db<>fiddle 表明这基本上有效。