質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • SQL

    2377questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQL 前月データの取得

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,680

hkrkgyk7

score 15

SQL初心者です。
以下の条件でデータを抽出したいのですが、
どのように書くとよいでしょうか。
可能な限り簡単なSQLを書きたいと思っています。
宜しくお願い致します。

////////////////////////////////////////////////////////
抽出条件:今月を基点として、購入日が前月の購入データを取得したい。
データベース:オラクル
抽出元:konyu.konyubi、syohin.syohinmei、konyu.kazu
(テーブル.項目名)
今月:2017,2

抽出イメージ:
購入日   |商品名|数|
-------------------       
20170101|あめ  |2|
20170115|ガム  |1|

/////////////////////////////////////////////////////////

自分が書ける範囲ですが、以下のSQLを考えてみました。
(恐れ入りますが、実行環境がない・初心者のため、構文ミスがあると思います。)

SELECT
 konyu.konyubi as "購入日"
,konyu.kazu as "数"
,syohin.syohinmei as "商品名"
FROM
 konyu
,syohin
WHERE
 konyu.konyubi = xxx

この、xxxの部分に以下のSQLを入れるのはいかがでしょうか。

Year([SalesDate])* 12 + DatePart("m", [SalesDate]) = Year(Date())* 12 + DatePart("m", Date()) - 1

(↑はネットで見つけたSQLです。)

////////////////////////////////////////////////////////

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SVC34

    2017/02/19 18:59

    テーブルの列名と属性、結合で使う列を示してください。FROM区のテーブル名はkonyubiではなくkonyuですよね。

    キャンセル

  • hkrkgyk7

    2017/02/19 21:34

    ご指摘いただきありがとうございます。不備があり、申し訳ないです。修正致します。

    キャンセル

  • m6u

    2017/02/20 09:20

    SQLは方言があるため、せっかくOracleタグが存在するのですから、Oracleタグを質問につけていただけると得意な方の目に留まりやすいと思います。

    キャンセル

  • Orlofsky

    2017/02/20 10:57

    列のデータ型やPRIMARY KEYを明確にするためにCREATE TABLE文やCREATE INDEX文も載せては?ローマ字表でへBン式を使わないのは最近は少数派ですが、他の人とネーミングが違ったりして後々困りませんか? http://www.geocities.jp/kagemusyamk1/r01-hepburn.html

    キャンセル

回答 5

checkベストアンサー

0

購入日がDATE型ならこんな感じでどうでしょうか。

SELECT
 konyu.konyubi as "購入日"
,konyu.kazu as "数"
,syohin.syohinmei as "商品名"
FROM
 konyubi
,syohin
WHERE
 konyu.konyubi >= trunc(add_months(sysdate,-1),'MM')
 and konyu.konyubi < trunc(sysdate,'MM')


--- 追記 ---
あれ!
テーブルが二つあるのか?
結合条件が分からないので、そのへんはよしなにやってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

商品名の絞り込み方が説明されていませんが、共通のキーの商品コードをshohincodeとして、WHERE 以降の行を推測すると、

WHERE
  konyu.shohincode = syohin.shohincode
  AND konyu.konyubi > 20170100
  AND konyu.konyubi < 20170200


のような条件指定になるでしょう。
商品コードで商品名を絞り込むのは、RIGHT JOIN 句を使った方が効率的ですが、難易度が上がります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

日付データを保存するのに、OracleだとDATE型、TIMESTAMP型、TIMESTAMP WITH TIME ZONE型、TIMESTAMP WITH LOCAL TIME ZONE型がありますし、
NUMBER(8)やVARCHAR2(8)ってこともありえます。
以下、DATE型やTIMESTAMP型の前提で進めます。

今日の日付を求める関数としてCURRENT_DATEやCURRENT_TIMESTAMPがあり、
これらに対してROUND(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')すれば
ひとまず先月が得られるため、
WHERE句で絞り込む際に「前月初日から前月末尾まで」という意味で、
TRUNC(konyubi, 'MONTH') = TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
する手もありますが、全レコードに対して演算が生じて遅くなりそうなので、
konyubiがTIMESTAMP型なら
konyubi >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH') AND konyubi < TRUNC(CURRENT_DATE, 'MONTH')
DATE型なら
konyubi >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH') AND konyubi <= LAST_DAY(TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH'))
ってならないでしょうか。

(普段PostgreSQLなので、間違いありましたらすみません。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

既に他の人からいろいろ回答が載っているので、ちょっとだけ。

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ;

SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) AS FROM1
, LAST_DAY(ADD_MONTHS(TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD') || '235959', 'YYYYMMDDHH24MISS'), -1)) AS TO1 
FROM DUAL ;

FROM1               TO1
------------------- -------------------
2017/01/01 00:00:00 2017/01/31 23:59:59

この結果を BETWEEN に使う。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

SELECT
konyu.konyubi as "購入日"
,konyu.kazu as "数"
,syohin.syohinmei as "商品名"
FROM
konyu
,syohin
WHERE
konyu.konyubi like to_char(add_months(sysdate,-1),'yyyymm')||'%'
and     konyu.code = syohin.code
;
sysdate が "20170202" の場合で、
konyu.konyubi が文字列が "20170102"とか入っているとして
"201701” + "%" LIKE で検索してみるとか?

また、 ”商品名"は、syohin(商品)テーブルに入っており、
多分、konyu(購入)テーブルにはコードで紐づいて、syohin(商品)テーブル
には必ずある場合、ないならOuter/LeftJoinとかですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2377questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。