
あるテーブルから、指定した期間のデータを抽出したいのですが、うまく取れません。
テーブル:RecData
SortID iYear iMonths Amount
--------------------------------------------
1 2002 3 100
1 2002 4 113
: : : :
1 2008 7 112
1 2008 8 102
2 2002 3 40
2 2002 4 34
: : : :
2 2008 7 43
2 2008 8 41
上記のようなテーブルがあるのですが、すべて数値型です。
このテーブルから、「SortIDが1で、2002年5月から2003年4月のデータ」を検索するにはどのようにしたら良いでしょうか?
「Select * from RecData Where SortID = 1 And iYear = 2002 And iMonths >= 5 Or SortID = 1 And iYear = 2003 And iMonths <= 4」
のようなやり方だと、「2002/04から2005/03」のような期間は正しく取れません。
その場合は1年づつループしなければ取れないでしょうか。
よろしくお願い致します。
使用しているDBはSQLServer2000 で、VBからSQL文を作成しています。
No.3ベストアンサー
- 回答日時:
# 現在手元にSQL Serverの環境もリファレンスもないので、検証できない状態ですが....。
厳密に日付型として評価させたいなら、CASTを使用して
WHERE
CAST(CAST(iYear AS VARCHAR) + '/' + CAST(iMonths AS VARCHAR)+ '/01' AS DATETIME)
BETWEEN
2002/05/01 AND 2003/04/30
のようにする必要がありそうです。
それよりは、日付型に拘らずに、
WHERE
(iYear * 100 + iMonths)
BETWEEN
200205 AND 200304
と数値型で処理した方が簡単です。
(No.2さんの案とほとんど同じですが....)
この方法なら、四則演算以外の知識を必要としないので、小学生でも実装が可能という利点があります。
# いずれにせよ、WHERE句の左辺で演算を行うので、途轍もなく遅そうなSQLですが....。
> 1年づつループしなければ取れないでしょうか。
お金が毟れる客が相手なら、最初は意図的に性能の悪い作りにしておいて、「チューニング」と称して後から予算を請求する戦略も考えられます。
どんな評価方法でも取れれば良いです。
なのでCASTより四則演算の方が簡単ですね。
しかもConvertも使わなくてすむし…。
実際に書いてやってみましたが、四則演算で取れてしまうし。
今まで取れなかった数年にまたがった期間もバッチリですね。
チューニングと称して予算を請求する戦略で、設計時に年と月が別で日付型にしなかったなんてことは…ないよなぁ…。今から「チューニング」するとVB側のSQL文を全部書き直しになるから違うでしょうねぇ。
ありがとうございます。
No.6
- 回答日時:
>が、やはり「2002年から2005年」のように、終了年が開始年の翌年で無い場合は
>「iYear = 2002」「iYear = 2003」を「iYear >= 2002」「iYear <= 2003」にしても
>ダメですよね
where
SortID = 1 And
((iYear = 2002 And iMonths >= 5)
or
(iYear = 2005 And iMonths <= 4)
or
(iYear > 2002 And iYear < 2005 And ))
何度もありがとうございます。
やはりOR でつなげていくんですね。
指定期間によってはVB側の分岐が複雑になりそうなので
今回はパフォーマンスは無視する事にいたします。
No.5
- 回答日時:
>冷静に見直してみると、No.1のSQLが最速のように見えます。
というか、最速です。
ちなみに#1のSQL以外は、iYearやiMonthsにインデックスをはっても効果がありません。
つまり、チューニングもできません。
#SortID、iYear、iMonthsの組が主キーだったらコストベースならインデックス勝手に使ってくれるかも
検索条件において、フィールドに対して関数を使ったり演算を行った場合、インデックスはそのフィールドに存在しても使用されません。
関数を使ったり、演算するのは最後の手段です。
え…?!チューニングもできないのですか?!
検索条件で演算しちゃうと、インデックスは無意味ですか。
複雑なSQLで1度で取るか、何度かSelect文を発行するか悩む時もありますが。
やろうとしてることは最後の手段だったのですね。
参考になりました。
ありがとうございます。
No.1
- 回答日時:
where
SortID = 1 And
((iYear = 2002 And iMonths >= 5)
or
(iYear = 2003 And iMonths <= 4))
この方法で試してみたところ、「2002/5~2003/4」は
ちゃんと取得できました。
が、やはり「2002年から2005年」のように、終了年が開始年の翌年で無い場合は「iYear = 2002」「iYear = 2003」を「iYear >= 2002」「iYear <= 2003」にしてもダメですよね…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インデックスの再構築の意味っ...
-
outlook2007 検索できないんです
-
インデックスがすぐに壊れます…
-
mysql IN句に1データだけ指定...
-
画像の赤丸で囲っている、角丸...
-
コクヨ タイトルブレーンでイ...
-
『ラミネートインデックスシー...
-
年と月が別カラムの場合のSQL
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
-
SELECT時の行ロックの必要性に...
-
Accessにインポートしたら並び...
-
SELECT文でのデッドロックに対...
-
オラクルではできるのにSQLSERV...
-
SQLServer Insertが遅い
-
accessのエクスポートエラーに...
-
ユニオンクエリの結果をテーブ...
-
accessテーブル作成クエリを実...
-
重複レコードの削除
-
DataTableから条件を満たした行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql IN句に1データだけ指定...
-
インデックスの再構築の意味っ...
-
ビューにインデックスを設定で...
-
【SQLServer】IS NULLのパフォ...
-
コクヨ タイトルブレーンでイ...
-
主キーにインデックスは貼らな...
-
[ BETWEEN ] vs [ >= AND <= ]
-
年と月が別カラムの場合のSQL
-
outlook2007 検索できないんです
-
数学でunprimedとは何を意味し...
-
Google検索はなぜ早い?
-
MySQLでFullTextインデックスの...
-
ホームページがGOOGLEにインデ...
-
MS-DOS時代のデーターベ...
-
テキスト項目255ケタのメリット...
-
500Gのテキストファイルから全...
-
インデックスがすぐに壊れます…
-
サーバ負荷を抑える大量データ...
-
インデックスについて
-
Oracleでの検索スピード
おすすめ情報