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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

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

Q&A

解決済

5回答

19029閲覧

SQL 前月データの取得

hkrkgyk7

総合スコア26

SQL

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

0グッド

0クリップ

投稿2017/02/19 09:11

編集2017/02/19 12:33

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です。)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SVC34

2017/02/19 09:59

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

2017/02/19 12:34

ご指摘いただきありがとうございます。不備があり、申し訳ないです。修正致します。
退会済みユーザー

退会済みユーザー

2017/02/20 00:20

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

2017/02/20 01:57

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

回答5

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とかですね

投稿2017/02/20 04:18

qmomo

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 に使う。

投稿2017/02/20 04:07

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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なので、間違いありましたらすみません。)

投稿2017/02/20 00:41

編集2017/02/20 00:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

SQL

1WHERE 2 konyu.shohincode = syohin.shohincode 3 AND konyu.konyubi > 20170100 4 AND konyu.konyubi < 20170200

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

投稿2017/02/19 11:35

編集2017/02/19 11:38
seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

SQL

1SELECT 2 konyu.konyubi as "購入日" 3,konyu.kazu as "数" 4,syohin.syohinmei as "商品名" 5FROM 6 konyubi 7,syohin 8WHERE 9 konyu.konyubi >= trunc(add_months(sysdate,-1),'MM') 10 and konyu.konyubi < trunc(sysdate,'MM')

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

投稿2017/02/19 11:21

編集2017/02/19 11:25
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問