
レンタルビデオ店や図書館で指定日範囲内の、貸出本数の合計の最大値を取得したいです。
※○月は○日が貸出ている本数が一番多かった…
テーブル上では8桁の日付と貸出本数を持っています。
例えば、下記データがテーブルに登録されている場合に、
where文で'20130101'~'20130131'と期間を指定すると'13'が抽出されます。
1月4日が13本貸出中で、指定期間内で一番貸出本数が多いからです。
貸出日/返却日/本数
------------------------------------------
20130101/20130104/4
20130102/20130105/6
20130104/20130108/3
20130106/20130109/8
20130110/20130114/5
------------------------------------------
調べてみたのですが、指定日の最大値取得は見つかりましたが、指定期間での抽出方法がわかりませんでした。
使用環境はSQLServerです。
ご協力、お願致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
全ての貸出日もしくは全ての返却日を調べれば一番貸出本数が多い日が含まれるはずなので、それを利用すれば良いかと。
例) ------------------------------------
SELECT
MAX(合計本数) AS 合計本数
FROM
(
SELECT
(SELECT SUM(本数) FROM 貸出 b WHERE a.貸出日 BETWEEN b.貸出日 AND b.返却日) AS 合計本数
FROM
(SELECT DISTINCT 貸出日 FROM 貸出 WHERE 貸出日 BETWEEN 20130101 AND 20130131) a
) c;
----------------------------------------
別名aのサブクエリーで全ての貸出日(重複なし)の集合を取得しています。
その一つ外側で、全ての貸出日について合計の本数を算出しています。
そして、一番外側で合計の本数が一番多いものを抽出しています。
日付を絞り込むには、一番内側の別名aのサブクエリーで条件を指定すれば良いです。
No.2
- 回答日時:
追記。
指定期間内での一番貸出本数が多いのは、order byとlimit使った以下です。
select
calendar.d,sum(number)
from
calendar cross join test
where
calendar.d between test.start and test.end
group by
calendar.d
order by
sum(number) desc limit 1;
No.1
- 回答日時:
(1)貸出日返却日本数テーブルをtestとして作って例のデータをインサートします。
create table test(start date, end date,number int(4));
(2)カレンダーテーブル作って、日にちをインサートします。(ひとまず1/1~1/14)
create table calendar(d date);
insert into d values(20130101),(20130102),(20130103),(20130104),(20130105),
(20130106),(20130107),(20130108),(20130109),(20130110),(20130111),(20130112),
(20130113),(20130114);
(3)カレンダーとtestをクロス結合してムニャムニャ(うまく説明できない)。
select
calendar.d,sum(number)
from
calendar cross join test
where
calendar.d between test.start and test.end
group by
calendar.d;
※理解できなければ以下をまずやってみてください。
select * from calendar cross join test;
(5)結果
+------------+-------------+
| d | sum(number) |
+------------+-------------+
| 2013-01-01 | 4 |
| 2013-01-02 | 10 |
| 2013-01-03 | 10 |
| 2013-01-04 | 13 |
| 2013-01-05 | 9 |
| 2013-01-06 | 11 |
| 2013-01-07 | 11 |
| 2013-01-08 | 11 |
| 2013-01-09 | 8 |
| 2013-01-10 | 5 |
| 2013-01-11 | 5 |
| 2013-01-12 | 5 |
| 2013-01-13 | 5 |
| 2013-01-14 | 5 |
+------------+-------------+
手元にあったのがmysqlだったのでmysqlで試しました。
カレンダーテーブルを事前に作ってますが、テンポラリに作って1行で済ませることもできそうです(多分)。
また、そもそもカレンダーテーブル使わなくてもできそうです。
できるんだったら、そのやり方を知りたいですねー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日付型項目のNULLについて(Pos...
-
外部参照してるキーを主キーに...
-
フィルターかけた後、重複を除...
-
SQLで特定の項目の重複のみを排...
-
差し込み後、元データを変更し...
-
SQLで列名を変数にできないでし...
-
for whichの使い方
-
エクセルで最後の文字だけ置き...
-
access2021 VBA メソッドまたは...
-
SELECT 文 GROUP での1件目を...
-
EXISTSを使ったDELETE文
-
Outlook 送受信エラー
-
カーソル0件の時にエラーを発生...
-
UPDATE文のWHERE条件に他のテー...
-
Accessの実行時エラーについて
-
速度が低下し無効になったアド...
-
JANコードとPOSコードは同じ?
-
SQL Left Join で重複を排除す...
-
SQLでフィールドの順番を変更し...
-
日本語のエイリアスは" "で囲...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
片方のテーブルに無いデータを...
-
SQLServerでtime型への変換
-
ストアドプロシージャについて
-
BULKINSERTのWITHオプションに...
-
されてしまいます。
-
サブクエリ
-
Access 2000 サブクエリとJOIN
-
ユーザーID入力について
-
SQLを教えてください
-
データ突合のよい方法を教えて...
-
マクロの同時実行
-
差分のSQL
-
PIC12C509A のアセンブルができ...
-
【SQL】指定期間の合計、MAX...
-
指定値を否定した条件で、NULL...
-
sql express内部結合して重複行...
-
VBA 100億になると#が自動...
-
テーブルの結合(GROUP BY句の制...
-
フィルターかけた後、重複を除...
-
差し込み後、元データを変更し...
おすすめ情報