-1

私は3列のテーブルを持っています:agent_id、log_id、date

|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'|

そして今、この結果をグループ化したい:
When log_id = 1then display date in column "logged in"
when log_id = 0then display date in column "loggedout" when then display date in column "loggedout"

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 |  

たとえば、agent_id = 1039 の Logged_in と Logged_out は 1 つの行にある必要があります。

4

2 に答える 2

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
于 2013-05-13T11:03:03.580 に答える
1

で集計関数を使用できますCASE。また、値が異なるため、グループ化するときに異なる行を引き起こすor値がGROUP BYあるため、しないでください。log_id01

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 を参照してください

次に、データベースに応じて、このクエリを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');

デモを見る

于 2013-05-13T11:04:31.723 に答える