如何在不同条件下两次选择相同的字段,并将结果显示为单独的字段
我想在C#中创建一个表适配器,如下所示。
我希望在不同条件下两次使用相同的表格,并且必须显示为两个不同的字段。
这是我的源表:
在AttendanceReg
表中,我需要根据AttendStatus
Count
每个学生的记录,以根据course and month
查找他们Absent and present
的天数。
示例查询:
Select AttendanceReg.StudentID , AttendanceReg.Studname , AttendanceReg.StudSex , AttendanceReg.StudCourse , Count(AttendanceReg.AttendStatus) As Total_Present , DatePart('m', AttendanceReg.DateOfAttendance) As Month From (AttendanceReg Inner Join LocalTable On AttendanceReg.StudCourse = LocalTable.AttendCourse And DatePart('M', AttendanceReg.DateOfAttendance) = LocalTable.AttentMonth ) Where (AttendanceReg.AttendStatus = 'Present') Group By AttendanceReg.StudentID , AttendanceReg.Studname , AttendanceReg.StudSex , AttendanceReg.StudCourse , DatePart('m', AttendanceReg.DateOfAttendance) Order By DatePart('m', AttendanceReg.DateOfAttendance) Desc
查询结果和期望的结果(第一张图片显示了我得到的内容,第二张图片显示了我真正想要的内容):
我需要做什么?
- 注意:我需要使用
LocalTable
,我无法传入参数来指定Course
和Month
SELECT A.StudentID, A.Studname, A.StudSex, A.StudCourse, SUM(CASE WHEN A.AttendStatus = 'Present' THEN 1 ELSE 0 END) AS TotalPresent, SUM(CASE WHEN A.AttendStatus = 'Absent' THEN 1 ELSE 0 END) AS TotalAbsent FROM AttendanceReg A INNER JOIN LocalTable L ON A.StudCourse = L.AttendCourse AND DatePart('M', A.DateOfAttendance) = L.AttentMonth) GROUP BY A.StudentID, A.Studname, A.StudSex, A.StudCourse
最后我解决了这个问题,感谢@Ikram Turgunbaev 🙂
这是守则
SELECT AttendanceReg.StudentID,AttendanceReg.Studname, AttendanceReg.StudSex, AttendanceReg.StudCourse, SUM(IIf( AttendanceReg.AttendStatus = 'Present', 1,0)) AS TotalPresent, SUM(IIf( AttendanceReg.AttendStatus = 'Absent', 1,0)) AS TotalAbsent, DatePart('m', AttendanceReg.DateOfAttendance) AS MYMONTH FROM (AttendanceReg INNER JOIN LocalTable ON AttendanceReg.StudCourse = LocalTable.AttendCourse AND DatePart('m', AttendanceReg.DateOfAttendance) = LocalTable.AttentMonth) GROUP BY AttendanceReg.StudentID, AttendanceReg.Studname, AttendanceReg.StudSex, AttendanceReg.StudCourse, DatePart('m', AttendanceReg.DateOfAttendance) ORDER BY DatePart('m', AttendanceReg.DateOfAttendance) DESC
同样的事情也可以用Switch :)来完成
SELECT EmpAttendance.EmpID, EmpAttendance.Empname, EmpAttendance.EmpSex, EmpAttendance.EmpDepartment, EmpProfileTBL.Salary, SUM(SWITCH(EmpAttendance.AttendStatus = 'Present', 1, EmpAttendance.AttendStatus = 'Absent', 0, EmpAttendance.AttendStatus = 'Half-Day', 0)) AS TotalPresent, SUM(SWITCH(EmpAttendance.AttendStatus = 'Absent', 1, EmpAttendance.AttendStatus = 'Present', 0, EmpAttendance.AttendStatus = 'Half-Day', 0)) AS TotalAbsent, SUM(SWITCH(EmpAttendance.AttendStatus = 'Half-Day', 1, EmpAttendance.AttendStatus = 'Present', 0, EmpAttendance.AttendStatus = 'Absent', 0)) AS HalfDay, DatePart('m', EmpAttendance.DateOfAttendance) AS CurMonth, ((EmpProfileTBL.Salary * TotalPresent) - (EmpProfileTBL.Salary * TotalAbsent) + ((EmpProfileTBL.Salary / 2) * HalfDay)) AS FinalSalary FROM ((EmpAttendance INNER JOIN LocalVariableTable ON EmpAttendance.EmpDepartment = LocalVariableTable.TempDepartment AND DatePart('m', EmpAttendance.DateOfAttendance) = LocalVariableTable.TempMonth AND DatePart('yyyy', EmpAttendance.DateOfAttendance) = LocalVariableTable.TempYear) INNER JOIN EmpProfileTBL ON EmpAttendance.EmpID = EmpProfileTBL.EmpID) GROUP BY EmpAttendance.EmpID, EmpAttendance.Empname, EmpAttendance.EmpSex, EmpAttendance.EmpDepartment, DatePart('m', EmpAttendance.DateOfAttendance), EmpProfileTBL.Salary ORDER BY DatePart('m', EmpAttendance.DateOfAttendance) DESC