【问题标题】:SQL Pivot Query for Attendance Report考勤报表的 SQL 透视查询
【发布时间】:2017-02-10 10:53:08
【问题描述】:

我为我的出勤报告编写了以下查询。除了一件事,一切都很好。现在,当我运行查询时,我的应用程序一天内允许多次签入/签出,它返回签入、签出、总计、签入结帐总计。我期望的结果是:签入,签出,签入,签出......总计。

下面是查询:

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 

感谢您在更改查询以使其按预期工作方面的任何帮助。 让我知道我是否在询问时感到困惑。

【问题讨论】:

  • 微软 sql server 2012.
  • 请提供一些关于输入的数据样本、您现在获得的查询结果以及您实际想要获得的输出。
  • 能否提供输入输出样本数据?
  • 你已经完成了第二步。你错过了第一步。首先使用 CTE 进行查询,在哪里处理签入、签出并给你想要的结果。然后使用 CTE,使查询枢轴。我认为这个查询将是动态的。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2012-04-21
    • 2020-06-01
    相关资源
    最近更新 更多