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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

日付でgroup byしたい(日を跨ぐ場合)

ms5025
ms5025

総合スコア290

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2回答

0グッド

0クリップ

302閲覧

投稿2022/12/01 07:15

編集2022/12/01 08:24

前提

・日付ごとにに売上実績データをgroup byしたい
・12/1 9:00- 12/2 8:59:59までが12/1のデータとして集計する
・売上のない日も0円で取得する
・テーブル定義は変えられない(集計用カラムの追加などは無し)

上記の条件を満たすために
日付の羅列のgenerate_seriesテーブルとLEFT JOINをして
結果を出す予定にしています

ここで
>・12/1 9:00- 12/2 8:59:59までが12/1のデータとして集計する
の仕様を忘れており、
このままだと、12/2 0:15の売上データは12/2分として group byされてしまうことになります

この場合SQL一本で上記の仕様を満たすSQ Lは作成できるでしょうか?

試したこと

愚直に・12/1 9:00- 12/2 8:59:59分データ ・12/2 9:00- 12/3 8:59:59のデータ・・
などsqlを日数分ループして自作で集計する方法しか思いつきませんでした。
これだと日数分SQLがコールされてしまいます。

例えば 日付の羅列をとるgenerate_seriesテーブルから取得する時間を
うまく加工して実現ができないでしょうか?
ここにfrom to列を自作して作り、それをjoinする、などはどうかなと思うのですが

SELECT CAST(generate_series AS DATE) AS tmp_date FROM generate_series(from_date, to_date, 1 day)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

postgreにも生成列があるようなので、時間差を設定したカラムを作っておけばよいでしょう

投稿2022/12/01 07:21

yambejp

総合スコア108937

spoofy_dragon😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ms5025

2022/12/01 07:51

あ!すみません、先に一言添えるのを忘れていました テーブル定義の変更はなしでお願いします 大きいシステムの一部の開発ですので、元のテーブルにカラム追加できないので質問しました
yambejp

2022/12/01 08:21

逆に言い忘れていましたが生成列をつかわなくてもそれに該当する計算式をつかって group by することは可能です しかしインデックスが効かない(効きにくい?)ので遅いだけです
ms5025

2022/12/01 09:25

そうですね!db_rowで自分で列を作ってgroup byすればいいだけか・・ 確かにインデックス効かないので要相談ですよね。 ありがとうございます!
sazi

2022/12/01 10:32 編集

> 確かにインデックス効かないので要相談ですよね。 インデックスの追加が駄目ではないなら、関数インデックスというのもありますよ。
ms5025

2022/12/02 00:08

>sazi ありがとうございます。 あと、このやり方以外にもし他の検討できる方法があればヒントをください。

0

売上実績テーブルが以下のように定義されていたとします。

SQL

1CREATE TABLE 売上実績 (売上日時 TIMESTAMP NOT NULL, 売上額 INT NOT NULL);

2022/12/01から2022/12/05の期間で、日付ごとの売上額の合計を集計したい場合、以下のようなSQLで実現可能かと思います。

SQL

1SELECT X.DT, COALESCE(SUM(U.売上額), 0) 2FROM GENERATE_SERIES(TIMESTAMP '2022-12-01 09:00:00', TIMESTAMP '2022-12-05 09:00:00', INTERVAL '1 DAYS') AS X(DT) 3LEFT OUTER JOIN 売上実績 AS U ON X.DT <= U.売上日時 AND U.売上日時 < (X.DT + INTERVAL '1 DAYS') 4GROUP BY X.DT

投稿2022/12/02 06:13

編集2022/12/02 06:18
neko_the_shadow

総合スコア1712

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。