-->

如何从一个多行子集在SQlLSERVER构建一个单列(How to Construct a Sing

2019-09-26 10:10发布

我有一个情况员工有时间在,和超时但它们与类型保存到单个列[在= 1,OUT = 2],我需要获取单个雇员时间(IN-OUT)的一个单行时间在,超时头分离。

下面是我的表的例子,

CREATE TABLE #Employee
(
empid int,
name varchar(20),
age int
)
CREATE TABLE #TIMEINOUT
(
    id int,
    empid int,
    timeinout datetime,
    [type] tinyint
)

INSERT INTO #Employee values(1,'Benny',35)
INSERT INTO #Employee values(2,'Algo',32)


INSERT INTO #TIMEINOUT VALUES(1,1,'2017-03-08 06:00:00 AM',1) -- (Type 1 = IN , 2 = Out)
INSERT INTO #TIMEINOUT VALUES(2,1,'2017-03-08 05:00:00 PM',2) -- (Type 1 = IN , 2 = Out)
INSERT INTO #TIMEINOUT VALUES(3,2,'2017-03-08 07:00:00 AM',1) -- (Type 1 = IN , 2 = Out)
INSERT INTO #TIMEINOUT VALUES(4,2,'2017-03-08 09:00:00 PM',2) -- (Type 1 = IN , 2 = Out)



SELECT * FROM #Employee INNER JOIN #TIMEINOUT ON #Employee.empid = #TIMEINOUT.empid

Select #Employee.empid,#Employee.name,#Employee.age,GETDATE() as TimeIN,GETDATE() as TimeOUT from #Employee

DROP TABLE #Employee
DROP TABLE #TIMEINOUT

任何人可以帮助简化查询?

Answer 1:

也许这样的事情? 单独列TimeinTimeOut

;with cte as (
SELECT e.empid,e.name,e.age,t.timeinout as TimeIn FROM #Employee e INNER  JOIN #TIMEINOUT t ON e.empid = t.empid
 where t.type=1
 )
 select t.empid,t.name,t.age,t.timein as TimeIn,t2.timeinout as Timeout from cte t

 inner join (
select * from #timeinout
where type=2
)t2
 on t.empid=t2.empid


Answer 2:

看看这个:

select a.empid,a.timeinout,b.timeinout from 
(select *,CONVERT(VARCHAR(10),timeinout,110) as this_in from TIMEINOUT where type = 1) as a
inner join
(select *,CONVERT(VARCHAR(10),timeinout,110) as this_out from TIMEINOUT where type = 2) as b
on a.empid = b.empid where a.this_in = b.this_out


Answer 3:

这是我如何做,

SELECT  #Employee.empid ,
    #Employee.name ,
    #TIMEINOUT.timeinout [TimeIN],
    X.timeinout [TimeOUT]
FROM    #Employee
    INNER JOIN #TIMEINOUT ON #TIMEINOUT.empid = #Employee.empid
    LEFT JOIN ( SELECT  #TIMEINOUT.empid ,
                        #TIMEINOUT.timeinout
                FROM    #TIMEINOUT
                WHERE   type = 2
              ) X ON X.empid = #Employee.empid
                     AND CONVERT(VARCHAR(10), #TIMEINOUT.timeinout, 111)   = CONVERT(VARCHAR(10), X.timeinout, 111)
WHERE   #TIMEINOUT.type = 1


文章来源: How to Construct a Single Row from a Multi Row Subset in SQlLSERVER