SQL-创建关于最后一个门使用情况的报告
我试图做一份报告,显示每天最后一次我们大楼的某扇门被打开 到目前为止,我得到的是一个函数,返回date(varchar(10)一个时间(varchar(5)),当我给它一个@datestart=datefrom时,我想开始一个报告(end date设置为GETDATE())和@id_door(我们在每个门的特定id下存储锁的日期和时间)。 看起来是这样的:最后一扇门时间(@DATESTART,@ID\u DOOR) 输出: 我的愿望是从@output表中选择*。我正在创建这样的表:SQL-创建关于最后一个门使用情况的报告,sql,function,sql-server-2008,datetime,Sql,Function,Sql Server 2008,Datetime,我试图做一份报告,显示每天最后一次我们大楼的某扇门被打开 到目前为止,我得到的是一个函数,返回date(varchar(10)一个时间(varchar(5)),当我给它一个@datestart=datefrom时,我想开始一个报告(end date设置为GETDATE())和@id_door(我们在每个门的特定id下存储锁的日期和时间)。 看起来是这样的:最后一扇门时间(@DATESTART,@ID\u DOOR) 输出: 我的愿望是从@output表中选择*。我正在创建这样的表: DECLAR
DECLARE @output TABLE (ID int IDENTITY(1,1) not null, Date VARCHAR(10)
null, Door1 VARCHAR(5) NULL, Door2 VARCHAR(5) NULL, .... PRIMARY KEY (ID))
DECLARE @DATESTART DATE = 'some date'
DECLARE @DATEEND DATE = GETDATE()
WHILE ( @DATESTART < @DATEEND )
BEGIN
INSERT INTO @output (Date) VALUES( @DATESTART )
SELECT @DATESTART = DATEADD(DAY, 1, @DATESTART )
END
+----+-------------+-------+--------+
| id | Date | Door1 | Door2 |
+----+-------------+-------+--------+
| 1 | 28.06.2017 | | |
+----+-------------+-------+--------+
| 2 | 29.06.2017 | | |
+----+-------------+-------+--------+
| 3 | 30.06.2017 | | |
+----+-------------+-------+--------+
接下来,我得到了内部文件
+-------------+--------+-------------+---------+
| ID_INT | ID_EMP | ID_BUILDING | ID_DOOR |
+-------------+--------+-------------+---------+
| 1 | 1 | 3 | 10 |
+-------------+--------+-------------+---------+
| 2 | 1 | 3 | 10 |
+-------------+--------+-------------+---------+
为了从中获得相关信息,我必须在int_id上将这两个连接在一起,以获得正确的门和正确的时间。我将此连接的输出放入@Temp表中,然后使用select和INTERNAL连接来获得每天的最大时间
Select DATE=convert(varchar(10),a.DATE_NAV,104), TIME=convert(varchar(5),R.MAXTIME,108)
from
(select max(DATE_NAV) as maxtime from @Temp group by day([DATE_NAV])) R
inner join @Temp a on R.MAXTIME=A.DATE_NAV
order by R.MAXTIME asc
这就是上次函数的全部内容。使用这些源表:
declare @AMB_DOOR table(id_INT int,date_nav datetime)
insert into @AMB_DOOR values (1, '2016-01-01 16:50')
insert into @AMB_DOOR values (2, '2016-01-01 17:20')
insert into @AMB_DOOR values (3, '2016-01-01 16:53')
insert into @AMB_DOOR values (4, '2016-01-01 17:21')
declare @INTERNAL_DOC table(id_INT int,id_EMP int,id_BUILDING int,id_DOOR int)
insert into @INTERNAL_DOC values (1,1,2,10)
insert into @INTERNAL_DOC values (2,1,3,10)
insert into @INTERNAL_DOC values (3,1,2,20)
insert into @INTERNAL_DOC values (4,1,3,20)
你可以得到你所需要的如下
select
id_door,
convert(date, date_nav) as [Date],
max(convert(varchar(8), convert(time, date_nav))) as Maxtime
from
@AMB_DOOR t1 left join @INTERNAL_DOC t2 on t1.id_int=t2.id_INT
group by
id_door,
convert(date, date_nav)
给予
请发布您的源表,我认为您已经陷入了一个不需要的兔子洞。看起来您正在将其视为一个过程编程问题,而不是关系数据库问题。添加源数据。编辑答案,这应该可以解决问题。如果您想转轴它,我建议使用您的报告工具来完成此操作如果可能,因为纯TSQL中的动态枢轴非常复杂。
declare @AMB_DOOR table(id_INT int,date_nav datetime)
insert into @AMB_DOOR values (1, '2016-01-01 16:50')
insert into @AMB_DOOR values (2, '2016-01-01 17:20')
insert into @AMB_DOOR values (3, '2016-01-01 16:53')
insert into @AMB_DOOR values (4, '2016-01-01 17:21')
declare @INTERNAL_DOC table(id_INT int,id_EMP int,id_BUILDING int,id_DOOR int)
insert into @INTERNAL_DOC values (1,1,2,10)
insert into @INTERNAL_DOC values (2,1,3,10)
insert into @INTERNAL_DOC values (3,1,2,20)
insert into @INTERNAL_DOC values (4,1,3,20)
select
id_door,
convert(date, date_nav) as [Date],
max(convert(varchar(8), convert(time, date_nav))) as Maxtime
from
@AMB_DOOR t1 left join @INTERNAL_DOC t2 on t1.id_int=t2.id_INT
group by
id_door,
convert(date, date_nav)
ID_DOOR DATE MAXTIME
10 2016-01-01 17:20:00
20 2016-01-01 17:21:00