2017-02-16 41 views
2

我有這個現有的表,如何在SQL中顯示來自現有表的不同表輸出?

My existing table (emp_attendance)

,我想選擇和顯示這樣的輸出:

desired output

是否有可能做到這一點的SQL?

+0

凡額外列是從哪裏來的? –

+0

如果它來自另一張桌子,那麼你可以加入兩張桌子來獲得你想要的輸出。 –

+0

沒有額外的表,我只是想重新安排它,只是爲了查看 – jessemiel

回答

0

我問我的朋友(主美香)關於這一點,並給了我這個答案,它的工作原理正好。這裏的答案與列名略有不同。

SELECT 
PVTIN.EMPNO, PVTIN.DTRDATE, PVTIN.TIMEIN, PVTOUT.[TIMEOUT], PVTIN.[AM OUT], PVTOUT.[AM IN], PVTIN.[LUNCH OUT], PVTOUT.[LUNCH IN], PVTIN.[PM OUT], PVTOUT.[PM IN] 

FROM 
(SELECT EMPNO, DTRDATE, [SHIFT] AS TIMEIN, AMBREAK AS [AM OUT], [LUNCH] AS [LUNCH OUT], [PMBREAK] AS [PM OUT] FROM 
(select * from 
(Select EMPNO, CONVERT(DATE, DTRDATE) AS DTRDATE, TRANS_TYPE, DT_START from dtr_emp_trans) TIN 

PIVOT 
(MAX(DT_START) FOR TRANS_TYPE IN ([SHIFT],[AMBREAK],[LUNCH],[PMBREAK])) PVT) PVTIN) PVTIN 

LEFT JOIN 
(SELECT EMPNO, DTRDATE, [SHIFT] AS TIMEOUT, AMBREAK AS [AM IN], [LUNCH] AS [LUNCH IN], [PMBREAK] AS [PM IN] FROM 
(select * from 
(Select EMPNO, CONVERT(DATE, DTRDATE) AS DTRDATE, TRANS_TYPE, DT_END from dtr_emp_trans) TIN 

PIVOT 
(MAX(DT_END) FOR TRANS_TYPE IN ([SHIFT],[AMBREAK],[LUNCH],[PMBREAK])) PVT) PVTOUT) PVTOUT 
ON PVTIN.EMPNO = PVTOUT.EMPNO AND PVTIN.DTRDATE = PVTOUT.DTRDATE 

是的。我就是這樣。

0

自加入也可能有用。現在沒有SQL Server。查詢可能看起來像

select 
EMPNO, 
DTRDate, 
T1.DT_START as ’TIME IN’, 
T1.DT_END as ’TIME OUT’, 
CASE T2.DT_END 
    WHEN T2.DT_END IS NOT NULL 
    THEN T2.DT_END 
    ELSE ‘-’ 
END AS ‘AM OUT’, 
CASE T2.DT_START 
    WHEN T2.DT_START IS NOT NULL 
    THEN T2.DT_START 
    ELSE ‘-’ 
END AS ‘AM IN’, 

CASE T3.DT_END 
    WHEN T3.DT_END IS NOT NULL 
    THEN T3.DT_END 
    ELSE ‘-’ 
END AS ‘LUNCH OUT’, 
CASE T3.DT_START 
    WHEN T3.DT_START IS NOT NULL 
    THEN T3.DT_START 
    ELSE ‘-’ 
END AS ‘LUNCH IN’, 

CASE T4.DT_END 
    WHEN T4.DT_END IS NOT NULL 
    THEN T4.DT_END 
    ELSE ‘-’ 
END AS ‘PM OUT’, 
CASE T4.DT_START 
    WHEN T4.DT_START IS NOT NULL 
    THEN T4.DT_START 
    ELSE ‘-’ 
END AS ‘PM IN’, 
FROM TABLENAME AS T1 
LEFT outer JOIN TABLENAME AS T2 ON T1.EMPNO == T2.EMPNO AND T1.TRANS_TYPE = ’SHIFT’ AND T2.TRANS_TYPE= ‘AMBREAK’ AND T1.TRANS_TYPE == T2.TRANS_TYPE AND T1.DTRDATE == T2.DTRDATE 
LEFT OUTER JOIN TABLENAME AS T3 ON T2.EMPNO == T3.EMPNO AND T2.DTRDATE == T3.DTRDATE AND T3.TRANS_TYPE = ’LUNCH’ AND T2.TRANS_TYPE == T3.TRANS_TYPE 
LEFT OUTER JOIN TABLENAME AS T4 ON T3.EMPNO == T4.EMPNO AND T4.DTRDATE == T3.DTRDATE AND T4.TRANS_TYPE = ’PMBREAK AND T3.TRANS_TYPE == T4.TRANS_TYPE 
where T1.TRANS_TYPE = ’SHIFT’ 
1

使用CASE聲明:

SELECT EmpNo, DTRDATE, 
(CASE WHEN TRANS_TYPE = 'Shift' THEN DT_START ELSE NULL END) TimeIN, 
(CASE WHEN TRANS_TYPE = 'Shift' THEN DT_END ELSE NULL END) TimeOUT, 
(CASE WHEN TRANS_TYPE = 'AMBreak' THEN DT_START ELSE NULL END) AMIN, 
(CASE WHEN TRANS_TYPE = 'AMBreak' THEN DT_START ELSE NULL END) AMOUT, 
etc... 

FROM YourTable 

閱讀這個問題更多的淨空:SQL Case Statement Syntax?

0

,我遲到了,但我花了更長的時間才能找到解決辦法..

create table #temp(
empno int, 
dtrdate date, 
trans_type nvarchar(18), 
dt_start time, 
dt_end time 
) 

insert into #temp(empno,dtrdate,trans_type,dt_start,dt_end) 
values 
(28, '01/02/2017','shift','10:53:27','22:05:47'), 
(28, '01/02/2017','ambreak','12:00:27','12:14:47'), 
(28, '01/02/2017','lunch','16:00:27','16:05:47'), 
(28, '01/03/2017','shift','12:47:27','22:47:47'), 
(28, '01/03/2017','ambreak','14:02:27','14:11:47'), 
(28, '01/03/2017','lunch','15:01:27','15:52:47'), 
(28, '01/03/2017','pmbreak','20:32:27','20:40:47') 


Select empno, dtrdate, 
max(case trans_type when 'shift' then dt_start else null end) as [time in], 
max(case trans_type when 'shift' then dt_end else null end) as [time out] 
...... 
...... 
from #temp 
group by empno, dtrdate 
0

我希望它幫你

SELECT t1.EmpNo, t1.DTRDATE, 
(CASE WHEN t1.DT_START is not null THEN t1.DT_START ELSE Null END) TimeIN, 
(CASE WHEN t1.DT_START is not null THEN t1.DT_END ELSE Null END) TimeOUT, 
(CASE WHEN t2.DT_START is not null THEN t2.DT_START ELSE Null END) AMIN, 
(CASE WHEN t2.DT_START is not null THEN t2.DT_END ELSE Null END) AMOUT, 
(CASE WHEN t3.DT_START is not null THEN t3.DT_START ELSE Null END) LUNCHIN, 
(CASE WHEN t3.DT_START is not null THEN t3.DT_END ELSE Null END) LUNCHOUT, 
(CASE WHEN t4.DT_START is not null THEN t4.DT_START ELSE Null END) PMIN, 
(CASE WHEN t4.DT_START is not null THEN t4.DT_END ELSE Null END) PMOUT 
FROM 
(select * from Table_1 where TRANS_TYPE = 'SHIFT') AS t1 left join 
(select * from Table_1 where TRANS_TYPE = 'AMBREAK') AS t2 on t1.EMPNO = t2.EMPNO and t1.DTRDATE = t2.DTRDATE left join 
(select * from Table_1 where TRANS_TYPE = 'LUNCH') AS t3 on t1.EMPNO = t3.EMPNO and t1.DTRDATE = t3.DTRDATE left join 
(select * from Table_1 where TRANS_TYPE = 'PMBREAK') AS t4 on t1.EMPNO = t4.EMPNO and t1.DTRDATE = t4.DTRDATE 
相關問題