2013-05-13 39 views
-1

我已經表3列:AGENT_ID,LOG_ID,日期SQL組無法正常工作時的日期在兩列

|log_id |agent_id|date     | 
---------------------------------------- 
|0  |1037 |'2013-05-11 10:26:30'| 
|1  |1041 |'2013-05-11 13:01:30'| 
|0  |1029 |'2013-05-11 08:22:30'| 
|0  |1058 |'2013-05-11 07:04:30'| 
|0  |1087 |'2013-05-11 18:54:30'| 
|1  |1039 |'2013-05-11 15:21:30'| 
|0  |1056 |'2013-05-11 14:28:30'| 
|0  |1039 |'2013-05-11 08:12:30'| 

而現在,我想這組結果:
log_id = 1然後在欄顯示日期「登錄」
當列log_id = 0則顯示日期「註銷」

我寫的SQL查詢

select 
agent_id, 
CASE WHEN log_id = 0 THEN date 
ELSE NULL 
END as "logged in", 
CASE WHEN log_id = 1 THEN date 
ELSE NULL 
END as "logged out" 
FROM agents 
group by agent_id, log_id, date 

但它沒有按預期工作。

|agent_id|logged_in   |logged_out   | 
---------------------------------------------------- 
1041  |     | 2013-05-11 13:01:30 
1029  |2013-05-11 08:22:30 | 
1039  |2013-05-11 08:12:30 | 
1058  |2013-05-11 07:04:30 | 
1039  |     | 2013-05-11 15:21:30 
1056  |2013-05-11 14:28:30 | 
1087  |2013-05-11 18:54:30 | 
1037  |2013-05-11 10:26:30 | 

例如logged_in和logged_out其中agent_id = 1039應該在一行中。

+1

你應該關鍵字讀了'離開join' – fyr 2013-05-13 10:53:27

+0

你怎麼確定哪些LOGGED_IN和logged_out日期爲每劑需要 - 如果有多個日期哪一個你想包括? – Dibstar 2013-05-13 11:00:20

回答

1

Tkank你@fyr它的工作原理

select 
a.agent_id, 
li.date, 
lo.date 
FROM agents a 
LEFT JOIN agents li ON (li.agent_id=a.agent_id and li.log_id = 0) 
LEFT JOIN agents lo ON (lo.agent_id=a.agent_id and lo.log_id = 1) 
group by a.agent_id, li.date, lo.date 
1

你可以使用聚合函數您CASE。也不要GROUP BYlog_id是因爲值是不同的,你有01值分組時,這將導致不同的行:

select agent_id, 
    max(
     CASE 
     WHEN log_id = 0 THEN date 
     ELSE NULL 
     END) as "logged in", 
    max(
     CASE 
     WHEN log_id = 1 THEN date 
     ELSE NULL 
     END) as "logged out" 
FROM agents 
group by agent_id; 

SQL Fiddle with Demo

然後根據您的數據庫,可以進一步將此查詢擴展爲GROUP BY日期,意思是沒有包含時間的日期,以便您可以獲得每天的登錄或註銷值。下面是使用MySQL查詢示例:

select agent_id, 
    date_format(date, '%Y-%m-%d') date, 
    max(
     CASE 
     WHEN log_id = 0 THEN date 
     ELSE NULL 
     END) as "logged in", 
    max(
     CASE 
     WHEN log_id = 1 THEN date 
     ELSE NULL 
     END) as "logged out" 
FROM agents 
group by agent_id, date_format(date, '%Y-%m-%d'); 

Demo