人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL文についてお聞きします。
以下の様にテーブルがあって

---
日付商品名価格
2010/11/12商品A1000
2010/11/12商品B500
2010/11/12商品C300
2010/11/13商品A1000
2010/11/13商品B400
2010/11/13商品C300
2010/11/14商品A800
2010/11/14商品B300
2010/11/14商品C300
2010/11/15商品A800
2010/11/15商品B300
2010/11/15商品C300
---

二日以内に値下げした商品を抽出するSQL文を書きたいです。

SQL文の書き方を教えていただけませんでしょうか?

●質問者: kamesann
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:SQL 価格 抽出
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●35ポイント ベストアンサー

【1】

RDBMSによって記述に微妙な違いがありますので、とりあえず二例あげておきます

いずれもテーブル名を Q1293380537 としています

下記はいずれもWHEREのサブクエリにて「過去2日以内で近いほうの日付の商品価格を抜き出し」て「当日の商品価格と比較」させて絞込みを行っています

(下記以外に総当りで求める方法などいくつかの方法があげられますが、考え方のシンプルなものを回答としました)

余談になりますが、どのような方法であっても商品名と日付での検索が高速処理させるためのキーポイントとなりますので、商品名と日付でのインデックスを作成(CREATE INDEX)しておいたほうがよろしいでしょう

(1)MySQL

SELECT *
FROM Q1293380537 a
WHERE (
 SELECT `価格`
 FROM Q1293380537 b
 WHERE (b.商品名 = a.商品名) AND (b.日付 BETWEEN adddate(a.日付, INTERVAL -2 DAY) AND adddate(a.日付, INTERVAL -1 DAY))
 ORDER BY b.日付 DESC
 LIMIT 0, 1
) > a.価格
;

(2)PostgreSQL

SELECT *
FROM Q1293380537 a
WHERE (
 SELECT "価格"
 FROM Q1293380537 b
 WHERE (b.商品名 = a.商品名) AND (b.日付 BETWEEN (a.日付 - INTERVAL '2 DAYS') AND (a.日付 - INTERVAL '1 DAY'))
 ORDER BY b.日付 DESC
 LIMIT 1
) > a.価格
;

上記いずれの結果も下記(順不同)になります

日付 商品名 価格
2010-11-13 商品B 400
2010-11-14 商品A 800
2010-11-14 商品B 300

【2】

求めるものが上記ではなく特定の日付だけを対象とする場合はa.価格だけでなく日付の指定を追加します

(1)MySQL、PostgreSQL共通の追加項目

) > a.価格 AND (a.日付 = '2010-11-14')

結果は下記になります

日付 商品名 価格
2010-11-14 商品A 800
2010-11-14 商品B 300

【3】

特定の日付が当日であるならば下記のようになりますがシステムのほうで日付を入力させて【2】のようなSQLを生成するほうが扱いやすい場合が多いです

(1)MySQL

) > a.価格 AND (a.日付 = current_date())

(2)PostgreSQL

) > a.価格 AND (a.日付 = current_date)

結果は下記になります

日付 商品名 価格

(質問文のサンプルに12月のデータが無いので何も返ってきませんね)

これだけ書いてAccessでしたなどと言われたらまた手直しです(笑)

次回からでも結構ですから何を使っているのかを書くようにしていただきたく思います

◎質問者からの返答

長文、ご丁寧な回答ありがとうございます。

SQLiteなので日付形式がありませんが、その部分は修正して試してみます。

年明けになってしまいますが、結果ご報告させていただこうと思います。


2 ● ふるるP
●35ポイント

「二日以内に値下げした」を前日の価格より値下げしている、または二日前より値下げしている、と解釈すれば、以下のようにかけるかと。

SELECT t1.商品名, t1.日付,t1.価格, t2.日付, t2.価格, t3.日付, t3.価格,

t1.価格-t2.価格 as 価格差1, t1.価格-t3.価格 as 価格差2

from ( tblKakaku t1

Left Join tblKakaku t2

On t1.商品名=t2.商品名 and t1.日付=(t2.日付+1) )

Left Join tblKakaku t3

On t1.商品名=t3.商品名 and t1.日付=(t3.日付+2)

Where (t1.価格-t2.価格<0 and t2.価格 is not null)

or (t1.価格-t3.価格<0 and t3.価格 is not null )

ここでテーブル名をtblKakakuとして、t1,t2,t3は本日、前日、前々日、のレコードになります。

日付の加算で+1で済ませていますが、データベースによっては不可なので、それはあわせてください。また必要のない項目は削除してください。

◎質問者からの返答

ご回答ありがとうございます。こちらも試させていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ