简体   繁体   English

根据不同条件在 Oracle Query 上选择计数

[英]Select count on Oracle Query based on distinct condition

I am newbie with oracle pl/sql,我是 oracle pl/sql 的新手,
right now using oracle sqldeveloper,现在使用oracle sqldeveloper,

i need help for my homework,我的家庭作业需要帮助,

how to make the column number 2, 3, 4, 5, 6, ... count based on first value column, the DISTINCT OWNER ?如何根据第一个值列 DISTINCT OWNER 使列号 2, 3, 4, 5, 6, ... 计数?

can anyone help me?谁能帮我? or suggest me with some hint?或建议我一些提示?

SELECT DISTINCT OWNER as SCHEMA, 
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'TABLE') "TABLE",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'VIEW') "VIEW",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'MATERIALIZED_VIEW') "MATERIALIZED VIEW",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'INDEX') "INDEX",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'SEQUENCE') "SEQUENCE",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'TYPE') "TYPE",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'SYNONYM') "SYNONYM",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'DATABASE LINK') "DATABASE LINK",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'LOB') "LOB",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'JOB') "JOB",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'TRIGGER') "TRIGGER",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'PROCEDURE') "PROCEDURE",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'FUNCTION') "FUNCTION",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'PACKAGE') "PACKAGE",
    (SELECT COUNT(DISTINCT OBJECT_NAME) FROM DBA_OBJECTS where object_type = 'PACKAGE BODY') "PACKAGE BODY"
    FROM DBA_OBJECTS
    WHERE OWNER IN ('BERKAS', 'BIAYAPERJALANAN', 'DASHBOARD', 'DIKLAT', 'FLATKKP', 'INVENT', 
    'KKPWEB', 'KKPWEBAUDITOR', 'KONTEN', 'LP2B', 'LPPB', 'MITRAKERJA', 'MOBILE', 'OLTPUSER', 'ONEDEE', 'PEGAWAI', 'PERENCANAAN', 
    'PETA', 'PM', 'PNBP', 'PNBPTRAIN', 'SIMPEG_1703', 'SIMPEG_2702', 'SIPT', 'SKP', 'SURAT', 'SURATBDG', 'TEMATIK', 'TIMKENDALI', 
    'WEBAPIDATA', 'WILAYAH') ORDER BY OWNER;

this is wrong, i need the count n other column based on the first column what should i do ?这是错误的,我需要根据第一列计算其他列,我该怎么办?

在此处输入图片说明

You should use conditional aggregation as following:您应该使用条件聚合如下:

SELECT OWNER as SCHEMA, 
    COALESCE(SUM(CASE WHEN object_type = 'TABLE' THEN 1 END), 0) "TABLE",
    COALESCE(SUM(CASE WHEN object_type = 'VIEW' THEN 1 END), 0) "VIEW",
    COALESCE(SUM(CASE WHEN object_type = 'MATERIALIZED_VIEW' THEN 1 END), 0) "MATERIALIZED VIEW",
    COALESCE(SUM(CASE WHEN object_type = 'INDEX' THEN 1 END), 0) "INDEX",
    COALESCE(SUM(CASE WHEN object_type = 'SEQUENCE' THEN 1 END), 0) "SEQUENCE",
    COALESCE(SUM(CASE WHEN object_type = 'TYPE' THEN 1 END), 0) "TYPE",
    COALESCE(SUM(CASE WHEN object_type = 'SYNONYM' THEN 1 END), 0) "SYNONYM",
    COALESCE(SUM(CASE WHEN object_type = 'DATABASE LINK' THEN 1 END), 0) "DATABASE LINK",
    COALESCE(SUM(CASE WHEN object_type = 'LOB' THEN 1 END), 0) "LOB",
    COALESCE(SUM(CASE WHEN object_type = 'JOB' THEN 1 END), 0) "JOB",
    COALESCE(SUM(CASE WHEN object_type = 'TRIGGER' THEN 1 END), 0) "TRIGGER",
    COALESCE(SUM(CASE WHEN object_type = 'PROCEDURE' THEN 1 END), 0) "PROCEDURE",
    COALESCE(SUM(CASE WHEN object_type = 'FUNCTION' THEN 1 END), 0) "FUNCTION",
    COALESCE(SUM(CASE WHEN object_type = 'PACKAGE' THEN 1 END), 0) "PACKAGE",
    COALESCE(SUM(CASE WHEN object_type = 'PACKAGE BODY' THEN 1 END), 0) "PACKAGE BODY"
    FROM DBA_OBJECTS
    WHERE OWNER IN ('BERKAS', 'BIAYAPERJALANAN', 'DASHBOARD', 'DIKLAT', 'FLATKKP', 'INVENT', 
    'KKPWEB', 'KKPWEBAUDITOR', 'KONTEN', 'LP2B', 'LPPB', 'MITRAKERJA', 'MOBILE', 'OLTPUSER', 'ONEDEE', 'PEGAWAI', 'PERENCANAAN', 
    'PETA', 'PM', 'PNBP', 'PNBPTRAIN', 'SIMPEG_1703', 'SIMPEG_2702', 'SIPT', 'SKP', 'SURAT', 'SURATBDG', 'TEMATIK', 'TIMKENDALI', 
    'WEBAPIDATA', 'WILAYAH') 
    GROUP BY OWNER
    ORDER BY OWNER;

Cheers!!干杯!!

Use a PIVOT :使用PIVOT

SELECT *
FROM (
  SELECT owner AS schema,
         object_name,
         object_type
  FROM   DBA_OBJECTS
  WHERE  OWNER IN (
    'BERKAS', 'BIAYAPERJALANAN', 'DASHBOARD', 'DIKLAT', 'FLATKKP', 'INVENT', 
    'KKPWEB', 'KKPWEBAUDITOR', 'KONTEN', 'LP2B', 'LPPB', 'MITRAKERJA', 'MOBILE',
    'OLTPUSER', 'ONEDEE', 'PEGAWAI', 'PERENCANAAN', 'PETA', 'PM', 'PNBP',
    'PNBPTRAIN', 'SIMPEG_1703', 'SIMPEG_2702', 'SIPT', 'SKP', 'SURAT',
    'SURATBDG', 'TEMATIK', 'TIMKENDALI', 'WEBAPIDATA', 'WILAYAH'
  )
)
PIVOT ( COUNT( DISTINCT OBJECT_NAME ) FOR OBJECT_TYPE IN (
  'TABLE' AS "TABLE",
  'VIEW' AS "VIEW",
  'MATERIALIZED_VIEW' AS "MATERIALIZED VIEW",
  'INDEX' AS "INDEX",
  'SEQUENCE' AS "SEQUENCE"
  -- rest of your object types.
) )
ORDER BY schema;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM