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

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

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

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

Q&A

解決済

1回答

3939閲覧

SQLで実働時間の合計を表示させたい

bd_

総合スコア21

SQL

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

0グッド

0クリップ

投稿2018/06/06 02:43

編集2018/06/06 04:04

前提・実現したいこと

SQLのSELECT文を用いて実働時間の合計を表示させたいです。

|開始時間|終了時間|実働時間|合計|
|:--|:--:|--:|
|08:30|19:30|10|25|
|09:00|17:30|7.5|
|09:00|17:30|7.5|

発生している問題・エラーメッセージ

実際の合計時間と表示されている合計時間が異なる
|開始時間|終了時間|実働時間|合計|
|:--|:--:|--:|
|08:30|19:30|10|53.99.....|
|09:00|17:30|7.5|41.50.....|
|09:00|17:30|7.5|41.50.....|

該当のソースコード

SQL

1SELECT 2to_char(kj.開始時間,'hh24:mi') as 開始時間, 3to_char(kj.終了時間,'hh24:mi') as 終了時間, 4(kj.終了時間 - kj.開始時間) * 24 - 1 as 実働時間, 5(select sum(kj.終了時間 - kj.開始時間) * 24 - 1 from 社員2 s) as 合計 6from 社員2 s 7 8inner join 勤務予定時間 k 9on s.社員ID = k.社員ID 10inner join 勤務時間 kj 11on s.社員ID = kj.社員ID 12and to_char(k.年月,'yyyy-mm') = to_char(kj.年月日,'yyyy-mm') 13where k.社員ID = '0001' 14and k.年月 = '2018-04-01 00:00:00'; 15 16 17```### 試したこと 18 19実働時間の合計を副問い合わせで表現した。 20 21### 補足情報(FW/ツールのバージョンなど) 22Oracle SQL Developer

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/06 02:45 編集

使用するデータベースの情報やOSの情報なども添えるべきです。クエリーの検討には関係するテーブルの構造も示すべきで、CREATE TABLE文やサンプルデータのINSERT INTO文も示すべきです。
m.ts10806

2018/06/06 02:46

テーブル定義も併せてご提示ください。
Kunihiro_Narita

2018/06/06 02:48

日付時刻型の扱いはデータベースの種類などによって異なります。データベースの種類、バージョン、カラムの型を明記してください。
ttyp03

2018/06/06 02:51

実際のデータと想定している値、現在の実行で得られる値もご提示ください。
sazi

2018/06/06 03:08

SQLは全文を記載下さい。from句以降がないと成り立たないSQLになっています
退会済みユーザー

退会済みユーザー

2018/06/06 04:23

日付とか時刻とかデータ型が何になっているかによってクエリーの作りも変わる重要な要素なのにね。SQL Developerで該当TableでColumnタブがどう表示されているかを掲載するだけでもいいのだけど。
sazi

2018/06/06 04:43

msts10806 さん 取り敢えず演算結果とかは確認されていたようなので、属性は関係ないかなと思って回答したんですが、啓蒙活動としてはそれらが揃うまで回答は控えた方がいいんですかね。
guest

回答1

0

ベストアンサー

相関副問合せになっていないので、全員分の実働時間の合計が算出されています。

社員2の集計の単位項目をidとした場合、以下のようにします

SQL

1SELECT id 2 , to_char(kj.開始時間,'hh24:mi') as 開始時間 3 , to_char(kj.終了時間,'hh24:mi') as 終了時間 4 , (kj.終了時間 - kj.開始時間) * 24 - 1 as 実働時間 5 , (select sum(kj.終了時間 - kj.開始時間) * 24 - 1 from 社員2 where id=kj.id) as 合計 6FROM 社員2 kj

※実際には集計期間の単位(例えば月ごと)があると思いますので、相関問い合わせのwhere 条件にはそれらも含める事になるかと思います。

追記

質問のSQL文が修正されたので、それに合わせて修正。
※joinなどの結合項目など、(インデックスがあれば適用されるように)最適化しています。

SQL

1SELECT to_char(kj.開始時間,'hh24:mi') as 開始時間 2 , to_char(kj.終了時間,'hh24:mi') as 終了時間 3 ,(kj.終了時間 - kj.開始時間) * 24 - 1 as 実働時間 4 ,(select sum(終了時間 - 開始時間) * 24 - 1 from 勤務時間 5 where 社員ID=kj.社員ID and to_char(年月日,'yyyy-mm')=to_char(k.年月,'yyyy-mm') 6 ) as 合計 7from 社員2 s 8 inner join 勤務予定時間 k 9 on s.社員ID = k.社員ID 10 inner join 勤務時間 kj 11 on k.社員ID = kj.社員ID 12 and to_char(k.年月,'yyyy-mm') = to_char(kj.年月日,'yyyy-mm') 13where k.社員ID = '0001' 14 and k.年月 = '2018-04-01 00:00:00'

※テーブル定義やインデックスに定義情報があれば、もっと適切な記述となる箇所があるかもしれません

投稿2018/06/06 02:57

編集2018/06/06 13:25
sazi

総合スコア25173

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問