问题描述
我有一个查询,它的计数大于 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,表明这基本上有效。