SQL Query将月份天数作为列,将总小时数作为行返回

时间:2017-07-02 10:23:52

标签: sql crystal-reports time-and-attendance

我正在处理一份出勤报告,我需要从一个表创建一个SQL查询,以返回员工在一个月内工作的净出勤时间。 每月的某一天应该是一列,而行中应该是员工的总小时数。

该表有6列(员工姓名,部门,职位,时间,超时和总时数

Picture for Selecting * From the Attendance Table

我想按以下方式返回值:

员工姓名 | 第一 | 第二次 | 第3次 | 第4次 | ...... | 6月30日

Emp 1 | 10:30 | | 10:40 | | 10:10 | | 10:21 |

应在参数中返回Days列,以便将其添加到crystal report中。

表格结构 如果你能告诉我。

提前致谢

3 个答案:

答案 0 :(得分:0)

您可以像这样使用CASE语句:

        SELECT EmployeeName,
               (CASE WHEN EXTRACT(YEAR FROM DATE) = 2017 AND EXTRACT(MONTH FROM DATE) = 6 AND EXTRACT(DAY FROM DATE) = 1 then totalHours ELSE NULL END) AS "01/06",
               (CASE WHEN EXTRACT(YEAR FROM DATE) = 2017 AND EXTRACT(MONTH FROM DATE) = 6 AND EXTRACT(DAY FROM DATE) = 2 then totalHours ELSE NULL END) AS "02/06",
               .
               .
               .
               (CASE WHEN EXTRACT(YEAR FROM DATE) = 2017 AND  EXTRACT(MONTH FROM DATE) = 6 AND EXTRACT(DAY FROM DATE) = 30 then totalHours ELSE NULL END) AS "30/06"

FROM Attendance

因此,每天都会创建一个新列。

答案 1 :(得分:0)

我使用过这样的东西

        CREATE TABLE `AxsLog` (
`id`    integer NOT NULL UNIQUE,
`Logon` text NOT NULL DEFAULT current_timestamp,
`Logoff`    text NOT NULL DEFAULT current_timestamp,
`Duration`  text NOT NULL DEFAULT 0,
`SysDat`    text NOT NULL DEFAULT current_timestamp,
PRIMARY KEY(`id`) );

您可以轻松地为用户表格中的每一行添加FK列。

保留每个条目的登录ID,然后在注销时更新该行

UPDATE  AxsLog
Set Duration= (SELECT sum( strftime('%s', logoff) - strftime('%s', logon) ) 
/60 FROM AxsLog WHERE id= 1 )
WHERE id= 1 ; 

要构建报告,请使用类似的内容。此查询仅提供每月总计。

select total(Duration)  
FROM AxsLog where substr(sysdat,6,2) = 'month' 

答案 2 :(得分:0)

您的要求可以通过使用交叉表报告来实现,或者如果您想在sql中实现然后使用数据透视