如何根据 SQL 中的特定列使用“计数”

问题描述

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

表格研究

   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.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.InternalStaff_1
HAVING COUNT(S.RollNo) > 1
ORDER BY RollNo
,

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

SELECT S.Name,COUNT(*) AS [Count],(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.DeptType
HAVING COUNT(*) > 1
ORDER BY RollNo;

Here 是一个 dbfiddle,表明这基本上有效。