Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法生成我的报告_Sql_Sql Server_Reporting - Fatal编程技术网

Sql 无法生成我的报告

Sql 无法生成我的报告,sql,sql-server,reporting,Sql,Sql Server,Reporting,我必须以以下格式生成报告: 员工代码名称dateintime dateoutime持续时间 例如: 员工代码名称01-08-2010intime 01-08-20100uttime 01-08-2010duration 1001 Amit 09:00 18:30 09:30 在SQLServerManagementStudio中,我已经写了5天这样的查询 Declare @intime table ( Staffcode varchar(7), Name varchar(100), [01-08

我必须以以下格式生成报告:

员工代码名称dateintime dateoutime持续时间

例如:

员工代码名称01-08-2010intime 01-08-20100uttime 01-08-2010duration

1001 Amit 09:00 18:30 09:30

在SQLServerManagementStudio中,我已经写了5天这样的查询

Declare @intime table
(
Staffcode varchar(7),
Name varchar(100),
[01-08-2010 InTime] datetime,
[02-08-2010 InTime] datetime,
[03-08-2010 InTime] datetime,
[04-08-2010 InTime] datetime,
[05-08-2010 InTime] datetime
)

Declare @outtime table
(
Staffcode varchar(7),
Name varchar(100),
[01-08-2010 outTime] datetime,
[02-08-2010 outTime] datetime,
[03-08-2010 outTime] datetime,
[04-08-2010 outTime] datetime,
[05-08-2010 outTime] datetime
)

Declare @Duration table
(
Staffcode varchar(7),
Name varchar(100),
[01-08-2010 Duration] datetime,
[02-08-2010 Duration] datetime,
[03-08-2010 Duration] datetime,
[04-08-2010 Duration] datetime,
[05-08-2010 Duration] datetime
)

Insert into @Intime
SELECT
StaffCode,
Name,
[01-08-2010] as [01-08-2010],
[02-08-2010] as [02-08-2010],
[03-08-2010] as [03-08-2010],
[04-08-2010] as [04-08-2010],
[05-08-2010] as [05-08-2010]
FROM
(
SELECT
StaffCode,
Name,
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate,
CONVERT(VARCHAR(5),MIN(FirstPunch),108) InTime
FROM AttendanceLog
JOIN Staff on Staff.Id = AttendanceLog.StaffId
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05'
AND Staffcode BETWEEN '10001' AND '10999'
AND name <>'' and workstatus = 'Is Working'
GROUP BY
name,StaffCode,AttendanceDate
)p

PIVOT
(
  MIN(InTime)
  FOR AttendanceDate
  IN
(
[01-08-2010],
[02-08-2010],
[03-08-2010],
[04-08-2010],
[05-08-2010]
)
)AS pvt


Insert into @Outtime

SELECT
StaffCode,
Name,
[01-08-2010] as [01-08-2010],
[02-08-2010] as [02-08-2010],
[03-08-2010] as [03-08-2010],
[04-08-2010] as [04-08-2010],
[05-08-2010] as [05-08-2010]
FROM
(
SELECT
StaffCode,
Name,
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate,
CONVERT(VARCHAR(5),MAX(LastPunch),108) OutTime
FROM AttendanceLog
JOIN Staff on Staff.Id = AttendanceLog.StaffId
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05'
AND Staffcode BETWEEN '10001' AND '10999'
AND name <>'' and workstatus = 'Is Working'
GROUP BY
name,StaffCode,AttendanceDate
)p

PIVOT
(
  MAX(OutTime)
  FOR AttendanceDate
  IN
(
[01-08-2010],
[02-08-2010],
[03-08-2010],
[04-08-2010],
[05-08-2010]
)
)AS pvt

Insert into @Duration

SELECT
StaffCode,
Name,
[01-08-2010] as [01-08-2010],
[02-08-2010] as [02-08-2010],
[03-08-2010] as [03-08-2010],
[04-08-2010] as [04-08-2010],
[05-08-2010] as [05-08-2010]
FROM
(
SELECT
StaffCode,
Name,
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate,
CONVERT(VARCHAR(5),(MAX(LastPunch) - MIN(FirstPunch)),114) Duration
FROM AttendanceLog
JOIN Staff on Staff.Id = AttendanceLog.StaffId
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05'
AND Staffcode BETWEEN '1001' AND '1999'
AND name <>'' and workstatus = 'Is Working'
GROUP BY
name,StaffCode,AttendanceDate
)p

PIVOT
(
  MAX(Duration)
  FOR AttendanceDate
  IN
(
[01-08-2010],
[02-08-2010],
[03-08-2010],
[04-08-2010],
[05-08-2010]
)
)AS pvt

Select

I.StaffCode,
I.Name,
CONVERT(VarCHAR(5),[01-08-2010 InTime],114)  [01-08-2010 InTime],
CONVERT(VarCHAR(5),[01-08-2010 OutTime],114) [01-08-2010 OutTime],
CONVERT(VarCHAR(5),[01-08-2010 Duration],114)[01-08-2010 Duration],
CONVERT(VarCHAR(5),[02-08-2010 InTime],114)     [02-08-2010 InTime],
CONVERT(VarCHAR(5),[02-08-2010 OutTime],114) [02-08-2010 OutTime],
CONVERT(VarCHAR(5),[02-08-2010 Duration],114)[02-08-2010 Duration],
CONVERT(VarCHAR(5),[03-08-2010 InTime],114)     [03-08-2010 InTime],
CONVERT(VarCHAR(5),[03-08-2010 OutTime],114) [03-08-2010 OutTime],
CONVERT(VarCHAR(5),[03-08-2010 Duration],114)[03-08-2010 Duration],
CONVERT(VarCHAR(5),[04-08-2010 InTime],114)     [04-08-2010 InTime],
CONVERT(VarCHAR(5),[04-08-2010 OutTime],114) [04-08-2010 OutTime],
CONVERT(VarCHAR(5),[04-08-2010 Duration],114)[04-08-2010 Duration],
CONVERT(VarCHAR(5),[05-08-2010 InTime],114)     [05-08-2010 InTime],
CONVERT(VarCHAR(5),[05-08-2010 OutTime],114) [05-08-2010 OutTime],
CONVERT(VarCHAR(5),[05-08-2010 Duration],114)[05-08-2010 Duration]
From @Intime I
JOIN @Outtime O on I.StaffCode=O.StaffCode
JOIN @Duration D on I.StaffCode=D.Staffcode
order by Staffcode
从这个查询中,我得到了在我公司工作的所有员工的工作时间、休息时间和持续时间

我还生成了这5天的报告

但现在我想生成n天的报告

这就是我需要做的

但我只想要列中的所有日期

请任何人告诉我该怎么做

请告诉我在查询中需要更改什么

我正在使用sql server 2005。。 还有一件事我认为我们需要使用while循环。。。 但是我不知道如何使用和在哪里使用。。 因为我是这个领域的新手


感谢和问候

首先,您不需要三张表来记录输入、输出时间和持续时间。您只需要一个将此数据合并到单个CTE中的CTE

然后,您需要为给定的timespan生成一个varchar格式的天数数组

declare @from datetime = '20100901', @to datetime = '20100910'
;with Calendar as
(
  SELECT CAST(@from as datetime) AS [date]
  UNION ALL
  SELECT DATEADD(dd, 1, [date])
  FROM Calendar
  WHERE DATEADD(dd, 1, [date]) <= @to
)
SELECT substring(convert(varchar, [date], 121), 1, 10) Day
FROM Calendar c
OPTION (MAXRECURSION 0);
然后将这些日期组合成一个字符串,并将其插入sql代码中使用这些日期的位置

然后使用exec命令运行这个庞大的查询

旁注。在这个任务中使用sql是很酷的,但就我个人而言,我会安装Report Builder并从您拥有的平面数据构建此报表,其中有各种可用的聚合函数,您无法在没有任何辅助函数的情况下仅使用sql轻松模仿

更新。