【问题标题】:How to select the same field twice with different conditions and display results as separate fields如何以不同的条件选择相同的字段两次并将结果显示为单独的字段
【发布时间】:2017-01-24 19:30:35
【问题描述】:

我想在 C# 中创建一个 Table Adapter,如下所示。

我希望在一个表中两次使用不同条件下的同一个字段,并且它必须显示为两个不同的字段。

这是我的源表:

AttendanceReg 表中,我需要Count 基于AttendStatus 的每个学生的记录,以根据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

【问题讨论】:

    标签: c# sql .net sql-server


    【解决方案1】:
     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
    

    【讨论】:

    • 执行时出现错误..无法解析查询文本。查询无法在图表和标准窗格中以图形方式表示。
    • 我正在使用 Microsoft Access Database 2010,我认为 access 数据库不支持“CASE WHEN”
    • SELECT StudentID,Studname,StudSex,StudCourse, SUM(IIf(AttendStatus = 'Present', 1,0)) AS TotalPresent, SUM(IIf(AttendStatus = 'Absent', 1,0)) AS TotalAbsent FROM AttendanceReg GROUP BY StudentID,Studname,StudSex,StudCourse 这几乎可以工作......现在我如何使用 where 条件来查询?
    • 可以在group by子句前添加where查询
    【解决方案2】:

    我终于解决了这个问题,感谢@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
    

    【讨论】:

      【解决方案3】:

      同样的事情也可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多