- ベストアンサー
SQL・・
SQL構築で聞かせてください。 テーブル 名前 購入月 購入日 カローラ 4 18 プリウス 5 2 クラウン 12 22 なカンジです・・。 文章で表すと、例えば、 4月16日~5月15日までのデータを取りたいのです。 SELECT * FROM kounyuu WHERE 名前 = プリウス 購入月 = 4 AND 購入日 >= 16 SELECT * FROM kounyuu WHERE 名前 = プリウス 購入月 = 5 AND 購入日 <= 15 この2つの SELECT 文を1つにすることは可能ですか? (名前には、常に同じ値が入ります)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
データベースの製品名とバージョンが分からないので、手元にある SQL Server 2005 で。 #1 さんの SQL だと 少なくとも SQL Server 2005 では、例えば 4/16 ~ 6/30 というように 3ヶ月にまたがる条件の場合に正しく検索できないように思います。 やや強引な感じですが、'testView' という名前の View を下記の定義で作成。 SELECT 名前, 購入月, 購入日, RIGHT('00' + CONVERT(nvarchar, 購入月), 2) + RIGHT('00' + CONVERT(nvarchar, 購入日), 2) AS 購入日付 FROM dbo.kounyuu 購入月と購入日をそれぞれ 頭が0から始まる 2桁の文字列にして連結した '購入日付' という計算列を作成しています。 カローラの行なら '0418' となり、プリウスの行なら '0502' となります。 この View に対して SELECT * FROM testView WHERE (購入日付 >= '0416') AND (購入日付 <= '0515') というような感じでどうでしょうか。 これなら開始日付と終了日付の 2つを指定するだけで済みます。
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
RDBMS名とバージョンを書きましょう。 具体的なSQL例を提示しても、あなたの環境では使えないかも知れません。 年の跨りはないのですか? 月と日を別々に管理すると、以下のような面倒な条件になってしまいます。 m1月d1日~m2月m2日を検索する場合・・・ SELECT * FROM kounyuu WHERE 名前='プリウス' AND (月=m1 AND 日>=d1 AND 月=m2 AND 日<=d2 OR 月>m1 AND 月<m2) 年の跨りがあると、さらに年の条件も加わり、複雑になってしまいます。 RDBMSで、「(列名1,列名2)>=(値1,値2)」といった条件指定が可能なら、 以下の条件でも大丈夫ではないかと思います。 SELECT * FROM kounyuu WHERE 名前='プリウス' AND (月,日)>=(m1,d1) AND (月,日)<=(m2,d2) DATE型を使い、年月日を一つの列にすると簡単です。 表の定義は、 CREATE TABLE T1 ( ~中略~ 購入年月日 DATE, ~中略~ ) 検索は、以下のようにできます。 SELECT * FROM kounyuu WHERE 名前='プリウス' AND (購入年月日>='2006-4-16' AND '2006-5-15') DATE型にすれば、年、月、日の部分だけを参照することもできます。
お礼
回答ありがとうございます。 >年の跨りはないのですか? すっかり忘れてました・・。 設計を1から見直し、DATE型にします。 貴重な意見、ありがとうございました。
- naochancom
- ベストアンサー率61% (41/67)
DBが分りませんので、オラクルで言うと SELECT * FROM kounyuu WHERE 名前 = プリウス and (購入月*100+ 購入日) between 416 and 515 でいけると思います。 フィールドを計算した結果で比較しています。 ただし、インデックスを使用しなくなると思いますので、データ量に伴いレスポンス低下になると思います。 フィールド構成が変更可能であれば、#3さんのように 日付型にされたほうが簡単だと思います。
お礼
回答ありがとうございます。 全体的な意見をまとめ、設計をやり直します。 今回は、レスポンスの意見もいただき参考になりました。 ありがとうございました。
何か特別な理由がなければ、テーブルの設計を変えるべきだと考えます。 購入年月日:日付型 日付型から「年」「月」「日」を抽出することは簡単ですし、日数計算(例えば金利を計算する場合)なども楽にできます。後々のことも考え、如何でしょうか?
お礼
回答ありがとうございます。 1から設計の見直しをします。 勉強不足な自分に回答いただきありがとうございました。
- toshi_2000
- ベストアンサー率30% (306/1002)
次の通りです。 WHERE 名前 = プリウス AND( 購入月 = 4 AND 購入日 >= 16 OR 購入月 = 5 AND 購入日 <= 15)
お礼
回答ありがとうございます。 率直な回答ありがとうございました。
お礼
回答ありがとうございます。 回答でもらった意見をもう一度、今のシステムの考えのやり直しに役立てたいと思います・・。