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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

2回答

12893閲覧

SQL Server 時間別集計で1時間ごとの中に30分、15分ごとの集計もしたい

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/03/07 00:31

分かりにくいタイトルで申し訳ないのですが、実現したいことは以下の通りです。

とあるログテーブル「log」があるとします。
datetime, int, で構成されているものとし、ログの落ちた日付時刻, ログ番号(1~3),とします。

この「log」テーブルを時間別で集計したいです。
集計したい時間を1時間ごとなら簡単にできますが、その中に「8時のみ8:00と8:30」、「17時のみ17:00と17:15」で集計したい場合どうしたらよいでしょうか?

集計したい時刻のテーブル「TimeTable」を作成し、そのテーブルでGROUP BYをしたのですが、
「8時のみ8時でかつ、30分より上か下か」と「17時のみ17時でかつ、15分より上か下か」の判断ができなくて困っています。
単純に「TimeTable」でグループ分けしてしまうと上の2つ以外は条件が合わず、集計が合いません。

「TimeTable」は以下の通りです。
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

集計する単位を整理しましょう。
集計は以下の場合に分けられます。この集計の単位を作り出せばいいわけです。
・datetime >= 8:00 and datetime < 8:30
・datetime >= 8:30 and datetime < 9:00
・datetime >=17:00 and datetime <17:15
・datetime >=17:15 and datetime <18:00
・上記以外は1時間単位

case文を用いて場合分けして、集計の単位を作り、集計します。

SQL

1select timeunit, count(*) 2from ( 3 select * 4 , case 5 when timepart >= '08:00' and timepart < '08:30' then '08:00' 6 when timepart >= '08:30' and timepart < '09:00' then '08:30' 7 when timepart >= '17:00' and timepart < '17:15' then '17:00' 8 when timepart >= '17:15' and timepart < '18:00' then '17:15' 9 else Format(datetime, 'HH') || ':00' 10 end as timeunit 11 from (select *, Format(datetime, 'HH:mm') as timepart from log) step1 12) step2 13group by timeunit

投稿2019/03/07 01:37

sazi

総合スコア25430

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

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

退会済みユーザー

退会済みユーザー

2019/03/07 02:09

ご回答ありがとうございます。 私の知識では例文として頂いたSQLを理解できなかったので、3行目以降のSELECT文から紐解いていこうと思い、その部分だけをSELECTしたのですが、「Format(datetime, 'HH') || ':00'」でどうもエラーが発生してしまいました。 「Format(datetime, 'HH') || ':00'」は「Format(datetime, 'HH:00')」ということでしょうか? 間違っていたらすみません。 私の環境はSQL Server2017の無償版、クエリを実行しているのはSSMSです。
退会済みユーザー

退会済みユーザー

2019/03/07 02:12

すみません。途中で投稿してしまいました。 「Format(datetime, 'HH:00')」と書き換えて3行目以降のSELECT文を実行すると、期待する値らしきものが取得できます。
sazi

2019/03/07 02:35 編集

手打ちでしかやってなかったので、エラーでしたかすみません。 最初は、Format(datetime, 'HH:00')としていましたが、'00'の書式でエラーになるのが嫌だったので、文字列の結合にしました。 エラー無く、変換できているなら問題ありません。
退会済みユーザー

退会済みユーザー

2019/03/07 04:02

ありがとうございます。頂いた例文で実現したいことができました。 大変勉強になりました。
guest

0

TimeTableには範囲の開始時刻だけではなく、終了時刻もあったほうがいいのでは?
例えば次のようなテーブル構成にします。

dtDateNamedtDatTimeStdtDatTimeEd
00:001:00
11:002:00
88:008:30
8:308:309:00

あとは次のような感じで集計すればいいのかな、と思います。

SQL

1SELECT A.dtDateName, B.no, COUNT(B.no) 2FROM TimeTable AS A,log AS B 3WHERE A.dtDatTimeSt <= B.datetime AND B.datetime < A.dtDatTimeEd 4GROUP BY A.dtDateName, B.no

投稿2019/03/07 01:35

ttyp03

総合スコア17000

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問