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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

2155閲覧

SQL(オラクル)で下記のようなSELECTを実現したい

tokyocats

総合スコア21

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2015/10/29 02:37

[TB1]
dt n1 n2 ymd
2015/10/01 10 20 20151001
2015/10/02 20 30 20151002
2015/10/03 40 10 20151003
2015/11/01 30 50 20151101
2015/11/02 20 10 20151102
2015/11/03 10 0 20151103

上記はあるSQLのSELECTの結果なのですが、
この結果からさらに、
dt列の月単位で各n列を集計足し算するようなSQLを
教えていただけますでしょうか。
下記のイメージが表示されればOKとなります。

dt n1 n2 ymd
2015/10/31 70 60 20151031
2015/11/30 60 60 20151130

また、いくつか要望と注意点がございます。

要望1
TB1をWITH句を使用して流用したSQLとしていただければとおもいます。

注意点
TB1はAとBというテーブル(A,Bは記述不要です)を
使用したSELECT結果でありまして、AをまずWITH句で
SELECTした結果をBのSELECTで使用しています。
したがいまして、トータルで出来上がるSQLには2つのwith句
が存在する形となります。

また、dtとymdは月の最終日を表示させます。

要望2
お手数おかけして大変申し訳ないのですが
dtとymdには'日'までが出てくるパターンと'月'まで
の計2個のSQLの記述をお願いします。

[SQL1の結果]
dt n1 n2 ymd
2015/10/31 70 60 20151031
2015/11/30 60 60 20151130

[SQL2の結果]
dt n1 n2 ymd
2015/10 70 60 201510
2015/11 60 60 201511

今回のご質問の背景といたしまして、
2度目のwith句使用でなぜかエラー(書き方が間違えているとおもわれますが)
が出てつまづいているためです。
もしかしたらwith句は二度記述してはいけないというのがSQLのルールなのでしたら
with句以外で効率の良いSELECT記述をご助言お願いします。

お手数おけかしますが、ご助言の程、宜しくお願いいたします。

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

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

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

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

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

kutsulog

2015/10/29 02:58

dtとymdのデータ型は何になりますか?
tokyocats

2015/10/29 04:11

ご投稿ありがとうございます。 dtはdate型,ymdはchar型となっております。
guest

回答2

0

丸投げしているといつまで経ってもスキルは身に付きません。

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

セッションが変更されました。

SQL> SELECT LAST_DAY(SYSDATE) FROM DUAL ;

LAST_DAY(SYSDATE)

2015/10/31 13:28:46

SQL> SELECT TRUNC(SYSDATE, 'MM') FROM DUAL ;

TRUNC(SYSDATE,'MM')

2015/10/01 00:00:00

SQL言語リファレンス
http://docs.oracle.com/cd/E16338_01/server.112/b56299/toc.htm
から
・LAST_DAY
・TRUNC(日付)

を参考に自分で考えて、ここまで出来たけど、、、、って改めて質問してください。

投稿2015/10/29 04:31

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

こんな感じでいかがでしょ?

SQL

1WITH 2 TB2 AS ( 3 SELECT TO_DATE('2015/10/01', 'YYYY/MM/DD') dt, 10 n1, 20 n2, '20151001' ymd 4 UNION ALL 5 SELECT TO_DATE('2015/10/02', 'YYYY/MM/DD') dt, 20 n1, 30 n2, '20151002' ymd 6 UNION ALL 7 SELECT TO_DATE('2015/10/03', 'YYYY/MM/DD') dt, 40 n1, 10 n2, '20151003' ymd 8 UNION ALL 9 SELECT TO_DATE('2015/11/01', 'YYYY/MM/DD') dt, 30 n1, 50 n2, '20151101' ymd 10 UNION ALL 11 SELECT TO_DATE('2015/11/02', 'YYYY/MM/DD') dt, 20 n1, 10 n2, '20151102' ymd 12 UNION ALL 13 SELECT TO_DATE('2015/11/03', 'YYYY/MM/DD') dt, 10 n1, 0 n2, '20151103' ymd 14) 15, TB1 AS ( 16 SELECT dt, n1, n2, ymd FROM TB2 17) 18SELECT 19-- SQL1の場合 20 LAST_DAY(dt) dt 21 , SUM(n1) n1 22 , SUM(n2) n2 23 , TO_CHAR(LAST_DAY(dt), 'YYYYMMDD') ymd 24-- SQL2の場合 25-- TO_CHAR(LAST(dt), 'YYYY/MM') dt 26-- , SUM(n1) n1 27-- , SUM(n2) n2 28-- , TO_CHAR(LAST_DAY(dt), 'YYYYMM') ymd 29FROM TBL1 30GROUP BY 31 LAST_DAY(dt) 32

日付型のままで日の出力省略はできないのでTO_CHARしています
2度目のWITHでエラーになるということでしたのでWITHを2段階にしています

投稿2015/10/29 04:30

kutsulog

総合スコア985

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

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

kutsulog

2015/10/29 04:40

SQLをまるっと書いてしまいましたがOrlofskyさんの言に賛同します そもそもWITHでエラーになったと言っているのに WITHの使い方ではなくすべてを質問したのでしょう?
tokyocats

2015/10/29 07:28

WITHは自分で解決しました。 別に丸々聞いているわけではありませんよ。 自分で調べても解決できず、やむを得ず質問しております。 時間(納期)もありますので。 ご理解ください。
Orlofsky

2015/10/30 09:14

わたしはパフォーマンス・チューニングで呼ばれて数100本単位のズタズタのSQLを丸々書き直すこともありますが、お金も時間もかかります。 tokyocatsさんOracle SQLの勉強中かと思いましたが、実務でやっているならSQL入門程度の有償研修を受講された方が良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問