![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
レンタルビデオ店や図書館で指定日範囲内の、貸出本数の合計の最大値を取得したいです。
※○月は○日が貸出ている本数が一番多かった…
テーブル上では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で質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- 会計ソフト・業務用ソフト 固定資産管理で貸し出したマンションの登録操作について【弥生の青色申告】 2 2023/03/07 11:05
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- 統計学 不偏分散について 3 2022/03/29 15:57
- 確定申告 不動産投資の減価償却費の算出方法 5 2022/12/03 15:06
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データ突合のよい方法を教えて...
-
日付型項目のNULLについて(Pos...
-
【SQL】指定期間の合計、MAX...
-
片方のテーブルに無いデータを...
-
BULKINSERTのWITHオプションに...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
ACCESSで、履歴事項を管理する...
-
エクセルで最後の文字だけ置き...
-
1、Rstudioで回帰直線を求める...
-
updateを1行ずつ実行したい。
-
Accessで処理経過を表示したい...
-
EXISTSを使ったDELETE文
-
止まなーい雨はない でもお前に...
-
Oracleのデータ型、NUMBERについて
-
SQLによる"あいうえお"順でソー...
-
SELECT 文 GROUP での1件目を...
-
データの先頭文字の置換
-
エクセルVBAコードで教えて下さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
BULKINSERTのWITHオプションに...
-
SQLServerでtime型への変換
-
片方のテーブルに無いデータを...
-
Access 2000 サブクエリとJOIN
-
日付型項目のNULLについて(Pos...
-
データ突合のよい方法を教えて...
-
VBA 100億になると#が自動...
-
【SQL】指定期間の合計、MAX...
-
SQL文について
-
sql express内部結合して重複行...
-
テーブルの結合(GROUP BY句の制...
-
DatePartを関数使うと、スペー...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
for whichの使い方
-
SQLで特定の項目の重複のみを排...
-
INSERT文でフィールドの1つだ...
おすすめ情報