SQL 查询,将月天数作为列返回,将总小时数作为行返回



我正在处理出勤报告,我需要从一个表创建一个 SQL 查询来返回员工当月净工作小时数的出勤率。 月中的某天应为一列,行中应为员工的总小时数。

该表有 6 列(员工姓名、部门、职位、上班时间、超时和总工时(

从出席表中选择 * 的图片

我想返回如下值:

员工姓名|第一名|第二名|第三名|第四届|...... |30 六月


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

天列应该在参数中返回,以便我可以将其添加到水晶报告中。

表结构 如果你能建议,请。

提前致谢

你可以像这样使用 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

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

我使用了这样的东西

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' 

可以使用交叉表报告满足您的要求,或者如果您想在SQL中实现,请使用透视

最新更新