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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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スクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1358閲覧

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

ms5025

総合スコア292

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スクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/12/01 07:15

編集2022/12/02 15:18

前提

・日付ごとにに売上実績データを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)

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

投稿2022/12/01 07:21

yambejp

総合スコア114581

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

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

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

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

総合スコア2225

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問