2016-07-12 4 views
2

労働時間を管理するソフトウェアを作成しています。毎日のために異なる活動ができます。 私は過去7日間に各労働者の労働時間を抽出したいと考えています。グループ単位で合計労働時間を計算する

サンプル行

+----+------------+-------+----------+----------+ 
| id | date | order | operator | duration | 
+----+------------+-------+----------+----------+ 
| 37 | 2016-06-12 | 27 |  1 |  180 | 
| 38 | 2016-06-12 | 28 |  3 |  390 | 
| 39 | 2016-06-12 | 27 |  1 |  480 | 
| 40 | 2016-06-04 | 21 |  2 |  120 | 
| 41 | 2016-05-07 | 27 |  1 |  90 | 
| 42 | 2016-06-07 | 27 |  1 |  150 | 
+----+------------+-------+----------+----------+ 

クエリ

SELECT SUM(`duration`) as `hours_per_day` 
FROM `sheets` 
WHERE `operator` = 1 AND `date` = DATE_ADD(CURDATE(), INTERVAL -7 DAY) 
ORDER BY `date` DESC 

期待される結果:

+------------------------+--------+--------+--------+--------+--------+--------+--------+ 
| Operator: Avareage Joe                | 
+------------------------+--------+--------+--------+--------+--------+--------+--------+ 
| Day:     | 01 jul | 02 jul | 03 jul | O4 jul | 05 jul | 06 jul | 07 jul | 
| Hours:     | 8  | 7  | 9  | 8  | 9  | 8  | 6  | 
+------------------------+--------+--------+--------+--------+--------+--------+--------+ 
+0

ティsでは、通常のSQLまたは動的SQLを使用した大きな(そして醜い)ピボット・クエリが必要になり、過去7日間のうちの1つ以上のデータがないオペレータの問題があります。そのためには、カレンダーテーブルを使用することができます。 –

答えて

1

SQL Fiddle Demo

SELECT 
CURDATE(), 
SUM(CASE WHEN CURDATE()     = `date` THEN `duration` ELSE 0 END) as today ,  
SUM(CASE WHEN CURDATE() - INTERVAL 1 DAY = `date` THEN `duration` ELSE 0 END) as yesterday, 
SUM(CASE WHEN CURDATE() - INTERVAL 2 DAY = `date` THEN `duration` ELSE 0 END) as `today - 2`, 
SUM(CASE WHEN CURDATE() - INTERVAL 3 DAY = `date` THEN `duration` ELSE 0 END) as `today - 3`, 
SUM(CASE WHEN CURDATE() - INTERVAL 4 DAY = `date` THEN `duration` ELSE 0 END) as `today - 4`, 
SUM(CASE WHEN CURDATE() - INTERVAL 5 DAY = `date` THEN `duration` ELSE 0 END) as `today - 5`, 
SUM(CASE WHEN CURDATE() - INTERVAL 6 DAY = `date` THEN `duration` ELSE 0 END) as `today - 6` 
FROM `work` 
where operator = 1 

OUTPUT

enter image description here

1

のは、それを試してみましょうこのように:

SELECT operator, `date`, (SUM(duration)/60) as hours_per_day 
FROM  sheets 
WHERE  `date` > NOW() - INTERVAL 7 DAY 
GROUP BY operator, date 
ORDER BY operator, date 

最初にWHERE節を見てください。 7日以上経過したものはすべて除外します。

次に、GROUP BYを使用して、残りのすべての行を取り出し、演算子と日付でグループ化します。したがって、基本的に小さな結果を得ることができます。

あなたのSUM(duration)操作は保持されました。この操作で、これらの小さなサブ結果のすべての合計が計算されるようになりました。私はちょうど分を追加しました。なぜなら明らかにあなたは時間ではなく分を保存しているからです。

最後に、ORDER BYを使用して、結果が大きな混乱のように見えないようにします。

あなたの結果は次のようになります。

operator | date   | hours_per_day 
--------------------------------------- 
1  | 2016-07-01 | 4 
1  | 2016-07-02 | 6 
1  | 2016-07-03 | 6 
2  | 2016-07-01 | 8 
2  | 2016-07-02 | 7 
+0

ちょっとしたヒント:予約語を識別子として使用することを避けた場合、クエリの表示はほとんど「prickly \」になりません。 ;) –

関連する問題