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

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

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

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

SQL

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

Q&A

解決済

1回答

1112閲覧

OracleSQLで歯抜けになったデータの取得方法

HachiPotch

総合スコア8

Oracle

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

SQL

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

0グッド

0クリップ

投稿2017/12/08 02:30

編集2017/12/08 02:31

OracleDBに下図の例のようにデータが登録されています。
データは各年度ごとに50件近くあります。

|年度|氏名|所属部署|退職理由コード|退職理由名称|
|:--|:--:|--:|
|2015|A|A|11|自己都合|
|2015|B|A|12|会社都合|
|2015|C|A|13|定年退職|
|2015|D|A|14|契約期間満了|
|2015|E|A|15|死亡|
|2015|F|A|11|自己都合|
|2016|G|A|13|定年退職|
|2016|H|A|15|死亡|

このテーブルから【年度・理由コード・退職理由・件数】を取得し、折れ線グラフを作成するのが目標です。
グラフは退職理由ごとにX軸に年度、Y軸に件数を表示させたいと思っています。

しかし、年度によっては特定の退職理由コードが存在しないときがあり、ここがネックになっています。
(2016年だと、11、12、14が抜けているような感じ)

データが歯抜けになってしまい、グラフに表示した際に折れ線が途中でぷつんと切れたような状態になってしまいます。
なので、歯抜けのデータには’0’を与えるような命令を書けないかと考えているのですが、行き詰っています。

抽出したいデータのイメージは下図の通りです。

|年度|退職理由コード|退職理由名称|件数|
|:--|:--:|--:|
|2015|11|自己都合|2|
|2015|12|会社都合|1|
|2015|13|定年退職|1|
|2015|14|契約期間満了|1|
|2015|15|死亡|1|
|2016|11|自己都合|0|
|2016|12|会社都合|0|
|2016|13|定年退職|1|
|2016|14|契約期間満了|0|
|2016|15|死亡|1|

このような感じでデータを取得する方法はありますでしょうか?
私はSQLに関してまだ始めたばかりで、PG経験はもともとありません…。

お手柔らかに教えていただけますと、幸いです。
何卒、よろしくお願い致します。(;_;)

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

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

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

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

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

maisumakun

2017/12/08 02:37

グラフ作成はSQL以外で行うものでしょうけど、その「別な環境で」存在しないデータを足す、という選択肢ではなくSQLで足す、という手法を取る理由は何かありますでしょうか。
HachiPotch

2017/12/08 02:47

コメントありがとうございます。私もそれを考えたのですが、都合上できる限りしたくないそうです。なので、すでにあるロジックにSQLで取ってきた値を入れる方向にしなければならず、困っている状況です。この回答でよろしいでしょうか?あまり詳しく分からず申し訳ありません( ˘•ω•˘ )
guest

回答1

0

ベストアンサー

理由コードと年度でCROSS JOINを取れば全組み合わせのリストが出来上がるので、そこにGROUP BY 年度, 退職理由コードCOUNTしたものをLEFT JOINして、あとはNULLを0に変換するようなクエリを書けばできあがるかと思います。

あと、おそらく手には負えないと思いますが、マスターでないテーブルに「退職理由コード」と「退職理由名称」が両方入っているのも、正規化されていなくてちょっと抵抗感のあるテーブル構造です(うっかり片方だけ書き換わったようなデータが混入したりすると…もう地獄です)。

投稿2017/12/08 02:56

maisumakun

総合スコア145183

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

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

HachiPotch

2017/12/08 04:56

時間がかかりましたが、なんとか思うようにできました! 本当にありがとうございます!!! そうなんですね。正規化?そこもしっかり勉強したいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問