2015-09-11 89 views
1

我试图从一个名为BioStar的数据库生成报告,该数据库来自Suprema Finger Print机器。下面是数据的样本,我有:SQL Server PIVOT with dateadd()

nDateTime   sUserName   department Event EventName nUserID 
---------   ---------   --------- ----- -------- ------ 
2015-08-15 07:52:37.000 Hamdy Mokhtar Moelem Nursing 0 In  75 
2015-08-15 16:26:14.000 Hamdy Mokhtar Moelem Nursing 1 Out  75 
2015-08-16 07:59:18.000 Hamdy Mokhtar Moelem Nursing 0 In  75 
2015-08-16 07:59:25.000 Hamdy Mokhtar Moelem Nursing 0 In  75 
2015-08-16 16:06:24.000 Hamdy Mokhtar Moelem Nursing 1 Out  75 
2015-08-16 16:06:30.000 Hamdy Mokhtar Moelem Nursing 1 Out  75 

这是存储过程我使用:

ALTER proc [dbo].[viewLogInfo] 

@UserIdn int, 
@startDate smalldatetime, 
@endDate smalldatetime 

as 
--exec viewLogInfo '75','2015-08-15','2015-08-25' 

select DATEADD(s,el.nDateTime,'1970-01-01') nDateTime, sUserName,ud.sName,el.nTNAEvent,dek.sEventName,nUserID from tb_Event_Log el 
join TB_USER u on el.nUserID=u.nUserIdn 
join TB_EVENT_DATA ed on el.nEventIdn=ed.nEventIdn 
join TB_TA_DEVICE_EVENT_KEY dek on el.nTNAEvent=dek.nKeyIdn 
join TB_USER_DEPT ud on u.nDepartmentIdn=ud.nDepartmentIdn 
where [email protected] and (DATEADD(s,el.nDateTime,'1970-01-01') between @startDate and @endDate) 

order by el.nEventLogIdn 

我希望报告看起来像这样:

nDateTime   sUserName    IN   OUT 
---------   ---------    --   --- 
2015-08-15   Hamdy Mokhtar Moelem 07:52:37  16:26:14 

这里是我迄今试过的:

USE [BioStar] 
GO 
/****** Object: StoredProcedure [dbo].[viewLogInfo12] Script Date: 09/11/2015 20:42:33 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER proc [dbo].[viewLogInfo12] 

[email protected] int, 
@startDate smalldatetime, 
@endDate smalldatetime 


as 
-- exec viewLogInfo12 '2015-08-01','2015-08-31' 
select sUserName,departmentName,event01,nUserID,nDateTime2,ev1, 
     [in] as inTime, [out] as outTime 
     e 

from 

(
select sUserName,ud.sName departmentName,el.nTNAEvent event01,dek.sEventName,dek.sEventName ev1,nUserID,DATEADD(s,el.nDateTime,'1970-01-01') nDateTime1,DATEADD(s,el.nDateTime,'1970-01-01') nDateTime2 from tb_Event_Log el 
join TB_USER u on el.nUserID=u.nUserIdn 
join TB_EVENT_DATA ed on el.nEventIdn=ed.nEventIdn 
join TB_TA_DEVICE_EVENT_KEY dek on el.nTNAEvent=dek.nKeyIdn 
join TB_USER_DEPT ud on u.nDepartmentIdn=ud.nDepartmentIdn 
where (DATEADD(s,el.nDateTime,'1970-01-01') between @startDate and @endDate) 

) m 

pivot 

(max(sEventName) 
for sEventName in ([in],[out])) pvt 

inTime和outTime均为null。 请帮忙。

+0

In和Out不列名可是,我想你需要把单引号周围的 '(MAX(sEventName)为sEventName在(['中'],['out']))' – NaNey

+0

@NaNey我试着把['in']和['out'],它是给出空值。任何其他建议。 – InAbuukar

+0

@InAbuukar:您可以使用示例数据和查询创建sqlfiddle吗? – DarkKnight

回答

0

cte中的查询是在你的程序中查询的。您也可以将数据插入到临时表中而不是使用CTE。

WITH CTE 
AS 
(
    --This is your query 
    SELECT Dateadd(s, el.ndatetime, '1970-01-01') nDateTime, 
      susername, 
      ud.sname, 
      el.ntnaevent, 
      dek.seventname, 
      nuserid 
    FROM tb_event_log el 
      JOIN tb_user u 
      ON el.nuserid = u.nuseridn 
      JOIN tb_event_data ed 
      ON el.neventidn = ed.neventidn 
      JOIN tb_ta_device_event_key dek 
      ON el.ntnaevent = dek.nkeyidn 
      JOIN tb_user_dept ud 
      ON u.ndepartmentidn = ud.ndepartmentidn 
    WHERE el.nuserid = @UserIdn 
      AND (Dateadd(s, el.ndatetime, '1970-01-01') BETWEEN 
       @startDate AND @endDate) 
)  
    --***This is where the magic happens*** 
    SELECT dateprt, 
      susername, 
      Min([in]) AS [In], 
      Max([out]) AS [out] 
    FROM (SELECT Cast(ndatetime AS DATE) AS dateprt, 
        Cast(ndatetime AS TIME) AS timeprt, 
        * 
      FROM CTE) pv 
      PIVOT (Max(timeprt) 
       FOR eventname IN ([In], 
            [Out])) AS pvt 
    GROUP BY dateprt, 
       susername 

小提琴这里.. http://sqlfiddle.com/#!3/e3218/1