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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

1回答

295閲覧

結果が2つになる問合せの条件分岐について

bottle

総合スコア12

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

0グッド

0クリップ

投稿2019/02/15 06:25

前提

つい先日質問した週番号についてなのですが,
4月1日が含まれる週を週番号の1として52まで振っていくSQL文について
4月1日はISO規格の週番号だと13か14になるので
問合せにて各年の4月1日の週番号が13と14どっちになるのかを取得して
条件分岐し、週番号を得たいと思っています。

###実現したいこと
4月1日を含む週を週番号1として
1~52まで週番号の振り分け
4月1日を含む週に始まって
3月の最終週までの

月曜スタートの週番号の取得

該当のソースコード

SQL

1SELECT YMD,CASE 2WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 13 3AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '2' AND YMD LIKE '%-04-01') 4 IN ('2','3','4','5') 5THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+39 6WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 13 7AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '3' AND YMD LIKE '%-04-01') 8 IN ('2','3','4','5') 9THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+39 10WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 13 11AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '4' AND YMD LIKE '%-04-01') 12 IN ('2','3','4','5') 13THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+39 14WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 13 15AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '5' AND YMD LIKE '%-04-01') 16 IN ('2','3','4','5') 17THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+39 18 19WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 14 AND 52 20AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '2' AND YMD LIKE '%-04-01') 21 IN ('2','3','4','5') 22THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-13 23WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 14 AND 52 24AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '3' AND YMD LIKE '%-04-01') 25 IN ('2','3','4','5') 26THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-13 27WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 14 AND 52 28AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '4' AND YMD LIKE '%-04-01') 29 IN ('2','3','4','5') 30THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-13 31WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 14 AND 52 32AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '5' AND YMD LIKE '%-04-01') 33 IN ('2','3','4','5') 34THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-13 35 36 37 38WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 12 39AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '1' AND YMD LIKE '%-04-01') 40 IN ('1','6','7') 41THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+40 42WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 12 43AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '6' AND YMD LIKE '%-04-01') 44 IN ('1','6','7') 45THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+40 46WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 12 47AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '7' AND YMD LIKE '%-04-01') 48 IN ('1','6','7') 49THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+40 50 51 52WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 13 AND 52 53AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '1' AND YMD LIKE '%-04-01') 54 IN ('1','6','7') 55THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-12 56WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 13 AND 52 57AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '6' AND YMD LIKE '%-04-01') 58 IN ('1','6','7') 59THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-12 60WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 13 AND 52 61AND (SELECT DISTINCT(K_DAY) FROM 'DATE' WHERE K_DAY = '7' AND YMD LIKE '%-04-01') 62 IN ('1','6','7') 63THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-12 64 65 66END AS SY_NO 67 68 FROM 'DATE' 69 WHERE YMD LIKE '%-04-01' 70 ORDER BY YMD;

↑曜日でデータを取得し各自条件分岐
しかし例外があり失敗

SQL

1 2SELECT YMD 3,CASE TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW')) 4 5WHEN 14 6THEN (CASE WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 13 7 THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+39 8 WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 14 AND 52 9 THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-13 10 END 11 ) 12 13 14ELSE (CASE WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 1 AND 12 15 THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))+40 16 WHEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))BETWEEN 13 AND 52 17 THEN TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(NEXT_DAY(YMD -7,2),'YYYY/MM/DD'),'YYYY/MM/DD'),'IW'))-12 18 END 19 ) 20 21 END AS SY_NO 22 23FROM 'DATE' 24ORDER BY YMD;

↑4月1日を指定して週番号を取得。そこから条件分岐
しかし上の「WHEN 14 」の文しか分岐せずデータ不整合

少しずらすと複数行問合せのエラー

試したこと

上記ソースコードのように
指定項目を変えて条件分岐の試行

カーソルやファンクションの作成
(知識不足から中途半端に終了)

補足情報(FW/ツールのバージョンなど)

SQL-developer- バージョン17.4.0.355

テーブル名:'DATE'
カラム:YEAR char
MONTH char
DAY char
NYEAR(年度) char
K_DAY(曜日番号) char →日曜が1 土曜が7 の順番
YMD(年月日) DATE
KI(0→前期,1→後期) char

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/15 11:11 編集

まずはFUNCTIONなどの勉強をしたらいいのではないでしょうか? 参考までにDUAL表からの固定値でなんとなく方法を考えるためのクエリを2つ作ってみました。 ■各年度の開始日を決めるクエリ SELECT YMD, YMD - TO_CHAR(YMD, 'D') + 1 AS STARTDAY FROM (SELECT TO_DATE('2019/04/01', 'YYYY/MM/DD') AS YMD FROM DUAL); ■特定の日付の週番号を決めるクエリ(開始日必要) SELECT YMD, FLOOR((YMD - TO_DATE('2019/04/01', 'YYYY/MM/DD')) / 7) + 1 AS WEENO FROM ((SELECT TO_DATE('2019/04/01', 'YYYY/MM/DD') AS YMD FROM DUAL) UNION ALL (SELECT TO_DATE('2019/04/02', 'YYYY/MM/DD') AS YMD FROM DUAL) UNION ALL (SELECT TO_DATE('2019/04/08', 'YYYY/MM/DD') AS YMD FROM DUAL)); OracleのバージョンはSQL DeveloperではなくてOracleのバージョンを書いた方がいいですよ。
wwbQzhMkhhgEmhU

2019/02/15 11:09

あとテーブル名のDATEはやめた方がいいのと、どうしてもそうしたい場合は、ダブルクォートで括った方がいいです。
bottle

2019/02/15 11:18

コメントありがとうございます。FUNCTION諸々につきましては自己解決しました。申し訳ない。 参考クエリありがとうございます! テーブル名やカラム名は実物とはちょっと違っていて、こうしたほうがわかりやすいかな?と、思いまして名前をつけました。誤解を与えてしまったようで申し訳ないです。ありがとうございます!
wwbQzhMkhhgEmhU

2019/02/15 11:24

解決したなら良かったです。頑張ってください。
Orlofsky

2019/02/15 19:31

前回は面倒だから書かなかってけど、テーブル定義はCREATE TABLE文で、データも何件かINSERT文で載せてください。DATEなどの予約語はテーブル名や列名には使ってはなりません。 SQLはもっとシンプルに。読む気になれません。何をしたいのかのコメントも入れてください。 Oracle SQLの熟練者をメンバーに入れた方が性能も寿命も長いシステムをトータルで安上がりで作れるでしょう。
guest

回答1

0

ベストアンサー

質問への追記・修正の依頼には markdown が使えないので、

何年度の第何週って、対前年、前々年などとデータを比較して売上予測したり、適性在庫の管理などに使います。

テーブルに不要な列は除いてください。インラインビュー(SELECTの中にSELECTがある)はごく普通に使えないでメンテしにくいシステムになってしまいます。

SQLで何をしているかわかりますか?

SQL

1SQL> SELECT TO_CHAR(A.DATE_FROM + ROWNUM - 1, 'YYYYMMDD IYYYIW D') AS YMD 2 2 FROM( 3 3 SELECT TO_DATE('2019/03/24', 'YYYY/MM/DD') AS DATE_FROM 4 4 , TO_DATE('2019/04/07', 'YYYY/MM/DD') AS DATE_TO 5 5 FROM DUAL 6 6 ) A 7 7 CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 ; 8 9YMD 10---------------------------------- 1120190324 201912 1 1220190325 201913 2 1320190326 201913 3 1420190327 201913 4 1520190328 201913 5 1620190329 201913 6 1720190330 201913 7 1820190331 201913 1 1920190401 201914 2 2020190402 201914 3 2120190403 201914 4 2220190404 201914 5 2320190405 201914 6 2420190406 201914 7 2520190407 201914 1 26 2715行が選択されました。

10年分も取得すれば結論が出るのは?

投稿2019/02/15 19:58

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問