如何在不同条件下两次选择相同的字段,并将结果显示为单独的字段

我想在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 ,我无法传入参数来指定CourseMonth

  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