2017-03-08 52 views
1

我有一種情況,員工有時間和超時,但他們被保存到一個類型爲[in = 1,out = 2],我需要使用Time-In,Time-Out標題以單行形式提取單個員工時間(in-out)。如何從SQlLSERVER中的多行子集構建單行

下面是桌子,我有爲例,

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 

任何人可以幫助簡化查詢?

+0

預期的輸出應該是 – Chanukya

+0

@ Chanukya..I已編輯並選擇了預期結果 – DareDevil

+0

您需要通過empid和日期來做到這一點? –

回答

0

這是我如何做,

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 
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 
+0

沒有結果t2無效 – DareDevil

+0

他剛剛錯過了t2.empid – Pream

+0

這是否適用於同一用戶的多次進出時間? – Pream

1

單獨列看看這個:

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 
+0

如果您想要員工姓名,只需加入員工。 –

+0

偉大的方法,我只是想選擇所有,然後選擇一個列與左連接具有相同的emp_id和相同的日期與差異是類型爲超時 – DareDevil

+0

日期是重要的,這就是爲什麼我用它包括在where子句中只是爲了使肯定 –