微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何根据 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,表明这基本上有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。