SQL Pivot查询出勤报告

时间:2016-10-02 09:26:00

标签: sql sql-server tsql sql-server-2012 pivot

我在下面查询了我的出勤报告。除了一件事,一切正常。我现在在我的应用程序中有一天允许多次签入/签出,当我运行我的查询时它返回checkin,checkout,total,checkin checkout total。我期望的结果是:签入,结账,签到,结账......总计。

以下是查询:

SELECT EmployeeID, Employee, [2016-09-01],[2016-09-02],[2016-09-05],[2016-09-06],[2016-09-07],[2016-09-08],[2016-09-09] from 
              (
                  SELECT src.EmployeeID, isnull(b.EmployeeName,'') +' '+ isnull(b.LastName,'')  Employee
                        ,[CheckinDate]
                        , ISNULL(CAST(c.LeaveDesc as VARCHAR(max)), STUFF((
                        SELECT ', ' + CAST(ISNULL(CheckinTime,'') AS VARCHAR(5))  + char(10) + CAST(ISNULL(CheckoutTime,'') AS VARCHAR(5)) + 
                        char(10) + CAST(ISNULL(TotalHours,'') AS VARCHAR(5))
                        FROM EmployeeDetail
                        WHERE (EmployeeID = src.EmployeeID and CheckinDate = src.CheckinDate) 
                        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
                        ,1,2,'')) AS Result
                        FROM [EmployeeDetail] as src inner join EmployeeMaster b on src.EmployeeID = b.EmployeeID and src.KindergardenID = b.KindergardenID  
                        left outer join leavetype c on src.leaveid = c.leaveid 
                        WHERE  src.KindergardenID = 1
                        GROUP BY src.EmployeeID, isnull(b.EmployeeName,'') +' '+ isnull(b.LastName,''), CheckinDate,LeaveDesc
             ) x
              pivot 
              (
                   max(Result)
                  for CheckinDate in ([2016-09-01],[2016-09-02],[2016-09-05],[2016-09-06],[2016-09-07],[2016-09-08],[2016-09-09])
              ) p 

任何有关更改查询以使其按预期工作的帮助都表示赞赏。 如果我在询问时感到困惑,请告诉我。

1 个答案:

答案 0 :(得分:0)

SELECT EmployeeID, Employee, ' + @cols + ' from 
              (
                  SELECT src.EmployeeID, isnull(b.EmployeeName,'''') +'' ''+ isnull(b.LastName,'''')  Employee
                        ,[CheckinDate]
                        , ISNULL(CAST(c.LeaveDesc as VARCHAR(max)), isnull(left(convert(time,DATEADD(minute,(SUM(DATEDIFF(MINUTE, ''0:00:00'', TotalHours))),0)),5),''N/A'') + char(10) + STUFF((
                        SELECT '', '' + CAST(ISNULL(CheckinTime,'''') AS VARCHAR(5))  + ''-'' + CAST(ISNULL(CheckoutTime,'''') AS VARCHAR(5)) + 
                        char(10) 
                        FROM EmployeeDetail
                        WHERE (EmployeeID = src.EmployeeID and CheckinDate = src.CheckinDate) 
                        FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''VARCHAR(MAX)'')
                        ,1,2,'''')) AS Result
                        FROM [EmployeeDetail] as src inner join EmployeeMaster b on src.EmployeeID = b.EmployeeID and src.KindergardenID = b.KindergardenID  
                        left outer join leavetype c on src.leaveid = c.leaveid 
                        WHERE  src.KindergardenID = ' + CAST(@kindergardenid as varchar(max)) + '
                        GROUP BY src.EmployeeID, isnull(b.EmployeeName,'''') +'' ''+ isnull(b.LastName,''''), CheckinDate,LeaveDesc
             ) x
              pivot 
              (
                   max(Result)
                  for CheckinDate in (' + @cols + ')
              ) p