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

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

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

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

SQL

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

Q&A

解決済

2回答

1385閲覧

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

tokyocats

総合スコア21

Oracle

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

SQL

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

0グッド

1クリップ

投稿2015/10/28 08:16

編集2015/10/28 08:34

SQL初心者です。

[テーブル]
c1 c2 c3
10/1 2 70
10/1 2 20
10/1 3 10
10/1 4 30
10/1 4 10
10/1 3 20
10/2 3 20
10/2 2 40
10/2 4 20
10/2 2 30
10/2 3 10
10/2 4 40

上記のようなテーブルからselectした結果が下記となるようにしたいのですが、SQLの記述がわかりません。
やりたいことといたしまして、c1の日付単位で各c2列の値毎にc3の値を合計した結果を算出することが目的です。

dt r2 r3 r4
10/1 90 30 40
10/2 70 30 60

select結果のr2はc2の2,r3はc2の3,r4はc2の4をあらわしております。
なお、c1の日付は説明のため10/1と10/2を表示していますが、可変いたしますので
sqlの中で'10/1'や'10/2'という値を直接書くのはNGとします。
また、group byの使用をお願い致します。

恐れ入りますが、ご助言の程、宜しくお願い致します。

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

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

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

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

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

hirohiro

2015/10/28 11:06

C2は2,3,4で固定なのでしょうか?それとも1や99が現れたりなどデータによって動的に変わるのでしょうか?そしてもし後者の場合は1や5や99がデータ中にあったとしても、抽出は2,3,4のみで大丈夫ですか?
tokyocats

2015/10/28 11:09

固定となっております。 本件、解決しましたのでもう大丈夫です。
guest

回答2

0

ベストアンサー

こんな感じでどうぞ

CASEWHENで集計

SQL

1SELECT 2 c1 r1 3 , SUM(CASE WHEN c2 = 2 THEN c3 ELSE 0 END) r2 4 , SUM(CASE WHEN c2 = 3 THEN c3 ELSE 0 END) r3 5 , SUM(CASE WHEN c2 = 4 THEN c3 ELSE 0 END) r4 6FROM [テーブル] 7GROUP BY 8 c1 9

またはPivot句を使って

SQL

1SELECT 2 c1 r1 3 , 2 r2 4 , 3 r3 5 , 4 r4 6FROM [テーブル] 7PIVOT (SUM(c3) FOR c2 IN (2, 3, 4)) AS PV 8

投稿2015/10/28 08:33

kutsulog

総合スコア985

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

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

tokyocats

2015/10/28 11:07

助かりました! ご回答頂き有難う御座います!
guest

0

こんなところかな?

with table1 as ( select '10/1' as c1, 2 as c2, 70 as c3 from dual union all select '10/1' , 2 , 20 from dual union all select '10/1' , 3 , 10 from dual union all select '10/1' , 4 , 30 from dual union all select '10/1' , 4 , 10 from dual union all select '10/1' , 3 , 20 from dual union all select '10/2' , 3 , 20 from dual union all select '10/2' , 2 , 40 from dual union all select '10/2' , 4 , 20 from dual union all select '10/2' , 2 , 30 from dual union all select '10/2' , 3 , 10 from dual union all select '10/2' , 4 , 40 from dual ) select t1.c1 , sum(case when t1.c2 = 2 then t1.c3 else 0 end) as r2 , sum(case when t1.c2 = 3 then t1.c3 else 0 end) as r3 , sum(case when t1.c2 = 4 then t1.c3 else 0 end) as r4 from table1 t1 group by t1.c1 order by t1.c1 ;

投稿2015/10/28 08:55

Orlofsky

総合スコア16415

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

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

tokyocats

2015/10/28 11:06

ご回答有難う御座います! 大変参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問