質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

1250閲覧

SQLのサブクエリを使って条件式を作る

rikutennis

総合スコア55

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/05/08 02:44

編集2020/05/08 04:38

リンク
###前提
tb_user_work_timeというDBがあります。

user_idwork_timework_date
107:00:002020-03-01
109:00:002020-03-02
212:00:002020-03-01
209:00:002020-03-02
308:00:002020-03-01
303:00:002020-03-02

このDBのユーザーごとに残業時間の合計時間を求めました。
ここでいう残業時間とは、1日に8時間を超えて働いた時間です。
なので以下のように、work_timeが8時間以上の時の、合計を算出しました。

sql

1SELECT user_id, SUM(work_time - 80000) 2FROM `tb_user_work_time` 3WHERE `tb_user_work_time`.`work_time` >800004GROUP BY user_id;

結果

user_idSUM(work_time - 80000)
101:00:00
203:00:00
300:00:00

本題

これに対して、残業時間の合計時間SUM(work_time - 80000) が2時間以上になる時だけ、
表示をするようなSQLがわかりません。
work_timeはtime型で、8時間以下になる時もあります。

追加として必要な情報があれば、コメントしていただけると嬉しいです。

###バージョン
サーバのバージョン: 5.6.47 - MySQL Community Server (GPL)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/08 03:40

日付関数が関わるので、SQLの種類やバージョンを記載してください
rikutennis

2020/05/08 04:00

追記しました!こちらで十分でしょうか?
退会済みユーザー

退会済みユーザー

2020/05/08 04:08

一応確認ですが、work_time のデータ型は time 型ですよね?
guest

回答2

0

質問の意図がわからないところがありますが、一応こんな感じで

投稿2020/05/08 04:31

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/08 04:31

create table tb_user_work_time(user_id int,work_time time,work_date date); insert into tb_user_work_time values (1,'08:00:00','2020-03-01'), (1,'09:00:00','2020-03-02'), (2,'12:00:00','2020-03-01'), (2,'09:00:00','2020-03-02'), (3,'08:00:00','2020-03-01'), (3,'10:00:00','2020-03-02');
yambejp

2020/05/08 04:33

10時間以上の残業時間の集計 select user_id ,sum(case when work_time>'10:00:00' then timediff(work_time,'10:00:00') else '00:00:00' end) as time2 from tb_user_work_time group by user_id
hoshi-takanori

2020/05/08 04:34

いつも不思議なのですが、どうしてコードをコメント欄に書くのでしょうか? 回答欄にマークダウンを使って書いた方が読みやすいと思いますが。
yambejp

2020/05/08 05:04 編集

会社のセキュリティーポリシーで投稿禁止されてるからです (少ない量のテキストや回答欄には制限がゆるいのでかけます) IT会社の宿命ですね。 ちなみにGitHubにもアクセスできません
guest

0

ベストアンサー

サブクエリを使わなくても、group by の結果に条件をつけるには having を使えばいいと思います。

修正: なお、MySQL では TIME 型の SUM は秒に変換して計算する必要があるようです。
参考: MySQLのtime型の合計 - Qiita

テーブル定義 (デバッグ用に user_id = 3 の work_date を変更しました。)

sql

1create table tb_user_work_time ( 2 user_id int, 3 work_time time, 4 work_date date, 5 primary key (user_id, work_date) 6); 7 8insert into tb_user_work_time values (1, '08:00:00', '2020-03-01'); 9insert into tb_user_work_time values (1, '09:00:00', '2020-03-02'); 10insert into tb_user_work_time values (2, '12:00:00', '2020-03-01'); 11insert into tb_user_work_time values (2, '09:00:00', '2020-03-02'); 12insert into tb_user_work_time values (3, '08:30:00', '2020-03-01'); 13insert into tb_user_work_time values (3, '09:30:00', '2020-03-02');

問い合わせ

sql

1select 2 user_id, 3 sec_to_time(sum(time_to_sec(work_time) - time_to_sec('8:00:00'))) as total_overtime 4from tb_user_work_time 5where work_time > cast('8:00:00' as time) 6group by user_id 7having total_overtime >= cast('2:00:00' as time);

結果

+---------+----------------+ | user_id | total_overtime | +---------+----------------+ | 2 | 05:00:00 | | 3 | 02:00:00 | +---------+----------------+

投稿2020/05/08 04:05

編集2020/05/08 05:04
hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikutennis

2020/05/08 04:58

ありがとうございました。
hoshi-takanori

2020/05/08 05:06

元のコードだと、work_time が例えば 8:30 と 9:30 で、残業時間の合計が 2 時間になるはずが、total_overtime が 16000 になってしまい、結果に出てこなかったので、計算方法を修正しました。
rikutennis

2020/05/08 06:38

わざわざ修正いただきありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問