2013-05-13 38 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

相关问题