Reputation: 111
i am trying to get some data is a specific format.Currently i have the below data in a table:
TARGET_NAME KEY_VALUE METRIC_COLUMN VALUE
-----------------------------------------------------------------------------
orclDB1_host orclDB1_host:DBMS_CREDENTIAL TABLE_NAME DBMS_CREDENTIAL
orclDB1_host orclDB1_host:DBMS_DDL TABLE_NAME DBMS_DDL
orclDB1_host orclDB1_host:DBMS_LOB TABLE_NAME DBMS_LOB
orclDB1_host orclDB1_host:DBMS_RANDOM TABLE_NAME DBMS_RANDOM
orclDB1_host orclDB1_host:DBMS_SQL TABLE_NAME DBMS_SQL
orclDB1_host orclDB1_host:DBMS_CREDENTIAL GRANTEE PUBLIC
orclDB1_host orclDB1_host:DBMS_DDL GRANTEE PUBLIC
orclDB1_host orclDB1_host:DBMS_LOB GRANTEE PUBLIC
orclDB1_host orclDB1_host:DBMS_RANDOM GRANTEE PUBLIC
orclDB1_host orclDB1_host:DBMS_SQL GRANTEE PUBLIC
orclDB1_host orclDB1_host:DBMS_CREDENTIAL PRIVILEGE EXECUTE
orclDB1_host orclDB1_host:DBMS_DDL PRIVILEGE EXECUTE
orclDB1_host orclDB1_host:DBMS_LOB PRIVILEGE EXECUTE
orclDB1_host orclDB1_host:DBMS_RANDOM PRIVILEGE EXECUTE
orclDB1_host orclDB1_host:DBMS_SQL PRIVILEGE EXECUTE
i need the above data in this format:
DB_TABLE TABLE_NAME GRANTEE PRIVILEGE
------------------------------------------ ----------------------------
orclDB1_host:DBMS_CREDENTIAL DBMS_CREDENTIAL PUBLIC EXECUTE
orclDB1_host:DBMS_RANDOM DBMS_RANDOM PUBLIC EXECUTE
orclDB1_host:DBMS_DDL DBMS_DDL PUBLIC EXECUTE
orclDB1_host:DBMS_SQL DBMS_SQL PUBLIC EXECUTE
orclDB1_host:DBMS_LOB DBMS_LOB PUBLIC EXECUTE
i tried the below sql,but am only able to get this:
select distinct KEY_VALUE as DB_AND_TABLE,VALUE as GRANTEE from mgmt$metric_current
where metric_name='ME$PUBLICPRIVS'
and target_name like 'orclDB1_host%'
and COLUMN_LABEL='GRANTEE'
Result:
DB_AND_TABLE GRANTEE
---------------------------------------
orclDB1_host:DBMS_LOB PUBLIC
orclDB1_host:DBMS_RANDOM PUBLIC
orclDB1_host:DBMS_SQL PUBLIC
orclDB1_host:DBMS_DDL PUBLIC
orclDB1_host:DBMS_CREDENTIAL PUBLIC
Can you please help.Thanks.
Upvotes: 1
Views: 66
Reputation: 1270713
Use conditional aggregation:
select KEY_VALUE as DB_AND_TABLE,
max(case when METRIC_COLUMN = 'TABLE_NAME' then VALUE end) as table_name,
max(case when METRIC_COLUMN = 'GRANTEE' then VALUE end) as GRANTEE,
max(case when METRIC_COLUMN = 'PRIVILEGE' then VALUE end) as PRIVILEGE
from mgmt$metric_current
group by key_value;
Upvotes: 1
Reputation: 168416
Use a PIVOT
:
SELECT *
FROM mgmt$metric_current
PIVOT (
MAX( value ) FOR metric_column IN (
'TABLE_NAME' AS table_name,
'GRANTEE' AS grantee,
'PRIVILEGE' AS privilege
)
)
Which, for your test data:
CREATE TABLE mgmt$metric_current ( TARGET_NAME, KEY_VALUE, METRIC_COLUMN, VALUE ) AS
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_CREDENTIAL', 'TABLE_NAME', 'DBMS_CREDENTIAL' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_DDL', 'TABLE_NAME', 'DBMS_DDL' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_LOB', 'TABLE_NAME', 'DBMS_LOB' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_RANDOM', 'TABLE_NAME', 'DBMS_RANDOM' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_SQL', 'TABLE_NAME', 'DBMS_SQL' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_CREDENTIAL', 'GRANTEE', 'PUBLIC' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_DDL', 'GRANTEE', 'PUBLIC' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_LOB', 'GRANTEE', 'PUBLIC' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_RANDOM', 'GRANTEE', 'PUBLIC' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_SQL', 'GRANTEE', 'PUBLIC' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_CREDENTIAL', 'PRIVILEGE', 'EXECUTE' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_DDL', 'PRIVILEGE', 'EXECUTE' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_LOB', 'PRIVILEGE', 'EXECUTE' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_RANDOM', 'PRIVILEGE', 'EXECUTE' FROM DUAL UNION ALL
SELECT 'orclDB1_host', 'orclDB1_host:DBMS_SQL', 'PRIVILEGE', 'EXECUTE' FROM DUAL;
Outputs:
TARGET_NAME | KEY_VALUE | TABLE_NAME | GRANTEE | PRIVILEGE :----------- | :--------------------------- | :-------------- | :------ | :-------- orclDB1_host | orclDB1_host:DBMS_SQL | DBMS_SQL | PUBLIC | EXECUTE orclDB1_host | orclDB1_host:DBMS_DDL | DBMS_DDL | PUBLIC | EXECUTE orclDB1_host | orclDB1_host:DBMS_RANDOM | DBMS_RANDOM | PUBLIC | EXECUTE orclDB1_host | orclDB1_host:DBMS_CREDENTIAL | DBMS_CREDENTIAL | PUBLIC | EXECUTE orclDB1_host | orclDB1_host:DBMS_LOB | DBMS_LOB | PUBLIC | EXECUTE
db<>fiddle here
Upvotes: 2