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

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

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

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

SQL

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

Q&A

解決済

2回答

454閲覧

DBA_OBJECTSビューでOWNER, OBJECT_TYPE毎の総数一覧を出力したい

kawase18

総合スコア11

Oracle

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

SQL

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

0グッド

0クリップ

投稿2017/09/04 14:37

編集2017/09/05 10:49

題名のとおりなのですが、
以下のようなSQLの練習の一環として以下のようなSQLを作成しました。
(SQL初心者なのでかなりへたくそなSQLですがご了承下さい)

SELECT Z.OWNER, A.INDEX_CNT, B.TABLE_CNT, C.VIEW_CNT FROM
(SELECT OWNER FROM DBA_OBJECTS GROUP BY OWNER) Z
,(SELECT OWNER, OBJECT_TYPE, COUNT() "INDEX_CNT" FROM dba_objects
WHERE OBJECT_TYPE = 'INDEX'
GROUP BY OWNER, OBJECT_TYPE) A
,(SELECT OWNER, OBJECT_TYPE, COUNT(
) "TABLE_CNT" FROM dba_objects
WHERE OBJECT_TYPE = 'TABLE'
GROUP BY OWNER, OBJECT_TYPE) B
,(SELECT OWNER, OBJECT_TYPE, COUNT(*) "VIEW_CNT" FROM dba_objects
WHERE OBJECT_TYPE = 'VIEW'
GROUP BY OWNER, OBJECT_TYPE) C
WHERE Z.OWNER = A.OWNER(+)
AND Z.OWNER = B.OWNER(+)
AND Z.OWNER = C.OWNER(+)

このSQLで各OWNERのOBJECT_TYPEが、TABLE、VIEW、INDEXの総数が出力されます。

私が実現したいのは、「各OWNERの各OBJECT_TYPE毎の総数一覧」を出力したいです。
上記のSQLで結合を繰り返せば可能ですが、もう少しスマートに実現できないでしょうか。

よろしくお願い致します。


すいません。
説明が足りませんでした。
以下のようにOBJECT_TYPEをカラムとしたいです。
(一番上部がヘッダーです)

OWENER table index view ・・・・・・・・・・
OWNER1 20 2 3 ・・・・・・・・・・
OWNER2 10 2 3 ・・・・・・・・・・
OWNER3 20 6 3 ・・・・・・・・・・
OWNER4 20 2 3 ・・・・・・・・・・
OWNER5 40 4 3 ・・・・・・・・・・
OWNER6 50 2 3 ・・・・・・・・・・
OWNER7 70 5 3 ・・・・・・・・・・
OWNER8 10 2 3 ・・・・・・・・・・

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

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

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

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

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

SVC34

2017/09/04 21:14

オブジェクトごとの数のカラムを横に持たせたいということでしょうか
guest

回答2

0

ベストアンサー

値をカラム名として横に並べるのは非リレーショナルな操作でSQLでは扱いにくいため、あまりお勧めしません。
Orlofskyさん回答のようにSQLでは単純にGROUP BYで集計するにとどめ、必要に応じてプログラミング言語側で編集した方がよいかと。

どうしてもSQLで処理する必要があるならば以下を参考にしてみてください。

  • OracleのPIVOT機能を使った書き方

sql

1SELECT * FROM ( 2 SELECT owner, object_type 3 FROM dba_objects 4) 5PIVOT ( 6 COUNT(object_type) AS cnt 7 FOR object_type IN ( 8 'TABLE' 9 ,'INDEX' 10 ,'VIEW' 11 ) 12) 13ORDER BY owner 14;
  • 標準SQLでの書き方

sql

1SELECT 2 owner 3 ,COUNT(CASE WHEN object_type = 'TABLE' THEN 1 ELSE NULL END) AS table_cnt 4 ,COUNT(CASE WHEN object_type = 'INDEX' THEN 1 ELSE NULL END) AS index_cnt 5 ,COUNT(CASE WHEN object_type = 'VIEW' THEN 1 ELSE NULL END) AS view_cnt 6FROM dba_objects 7GROUP BY owner 8ORDER BY owner 9;

投稿2017/09/05 15:42

SVC34

総合スコア1149

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

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

Orlofsky

2017/09/05 18:39

その通り。使うOBJECT_TYPEが増えるたびにプログラムの修正が必要になります。
kawase18

2017/09/07 13:20 編集

ご回答ありがとうございます。 大変勉強になりました。
guest

0

SQL

1SELECT 2 OB.OWNER 3 , OB.OBJECT_TYPE 4 , COUNT(*) AS COUNTS 5FROM DBA_OBJECTS OB 6GROUP BY 7 OB.OWNER 8 , OB.OBJECT_TYPE 9ORDER BY 10 OB.OWNER 11 , OB.OBJECT_TYPE ;

ってところでしょうか?

GROUP BY を GROUP BY CUBE に変えると全OBJECT_TYPE毎の合計も取得できます。

SQL

1COLUMN OWNER FORMAT A30 2COLUMN OBJECT_TYPE FORMAT A21 3COLUMN COUNTS FORMAT 999,990 4SELECT 5 NVL(OB.OWNER , 'OWNER TOTAL') AS OWNER 6 , NVL(OB.OBJECT_TYPE, 'OBJECT_TYPE TOTAL') AS OBJECT_TYPE 7 , COUNT(*) AS COUNTS 8FROM DBA_OBJECTS OB 9GROUP BY CUBE 10 ( 11 OB.OWNER 12 , OB.OBJECT_TYPE 13 ) 14ORDER BY 15 OB.OWNER 16 , OB.OBJECT_TYPE ;

頑張ってください。

投稿2017/09/04 18:22

編集2017/09/05 13:14
Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問