SQL报表-查询多个表

SQL Report - query multiple tables

我一直在 APEX 的统计页面上工作,目前有以下报告查询:

select to_char(DATELOGGED,'Month - YYYY') as Month, 
COUNT(*) as "Total Calls",
 SUM(case when CLOSED is null then 1 else null end) as "Open",
 COUNT(case CLOSED when 'Y' then 1 else null end) as "Closed",
 SUM(case when EXTREF is null then 0 else 1 end) as "Referred",
 round((COUNT(case SLA_MET when 'Y' then 1 else null end)/COUNT(case CLOSED when 'Y' then 1 else null end)*100),2) as "SLA Met %"

 from IT_SUPPORT_CALLS 
GROUP BY to_char(DATELOGGED,'Month - YYYY')
order by MIN (DATELOGGED) desc

我想从另一个 table:

添加 DURATION 的总和
select
"START_TIME",
DECODE(DURATION,null,'Open',((select extract( minute from DURATION ) 
    + extract( hour from DURATION ) * 60
    + extract( day from DURATION ) * 60 * 24
  from dual)||' minutes')) DURATION
from "IT_DOWNTIME"

IT_DOWNTIMEtable使用START_TIME(varchar2)作为日期标识符,IT_SUPPORT_CALLS使用DATELOGGED(DATE)作为日期标识符。

IT_DOWNTIME 的当前输出例如:

2019 年 2 月 8 日 - 30 分钟

2019 年 2 月 20 日 - 15 分钟

我想要报告 SUM 和组 IT_DOWNTIME 并将其添加到现有报告中。

希望这是有道理的。

如果我遗漏了任何有助于解决此问题的信息,请告诉我。

非常感谢

非常感谢,非常感谢。不幸的是,它 return 没有来自 IT_DOWNTIME. 的任何数据 我猜不同的日期格式没有帮助,希望这能让事情变得更清楚:

这些是 IT_DOWNTIME 中感兴趣的列: START_TIME ( VARCHAR2(30) ) 持续时间(间隔天(2)到秒(6))

当前 IT_DOWNTIME 无格式输出示例:

START_TIME

06-JUL-2016 11:05

持续时间

+00 00:35:00.000000

当前 IT_SUPPORT_CALLS 无格式输出示例:

DATELOGGED

06/07/2016

类似这样的事情可能会做到,但是对于您的列名等有一些猜测:

SELECT * 
FROM
  (
    SELECT
      to_char(DATELOGGED,'MON-YYYY') as Month, 
      COUNT(*) as Total_Calls,
      SUM(case when CLOSED is null then 1 else null end) as case_Open,
      COUNT(case CLOSED when 'Y' then 1 else null end) as case_Closed,
      SUM(case when EXTREF is null then 0 else 1 end) as case_Referred,
      round((COUNT(case SLA_MET when 'Y' then 1 else null end)/COUNT(case CLOSED when 'Y' then 1 else null end)*100),2) as percent_SLA_met
    FROM IT_SUPPORT_CALLS 
    GROUP BY to_char(DATELOGGED,'MON-YYYY')
  ) calls
  LEFT JOIN 
  (
    SELECT  
      SUBSTR(START_TIME, 4) as down_month,
      SUM(extract(minute from DURATION) + 
        extract(hour from DURATION) * 60 +
        extract(day from DURATION) * 60 * 24
      ) || 'minutes' as total_down_mins 
    FROM IT_DOWNTIME 
    WHERE duration is not null
    GROUP BY SUBSTR(START_TIME, 4)
  ) downs
  ON calls.month = downs.down_month

将第一个查询的日期格式更改为 MON-YYYY 以使其与您声称的第二个查询的 varchar2 日期格式 (dd-mon-yyy) 一致,并将日期子字符串化为删除日期,只留下月份

编辑:

好的,既然您发布了一些来自 IT_DOWNTIME 的不同示例数据,我就明白了问题所在:日期上也有时间。这次您的第一个样本数据不包含,它只是一个日期(作为字符串)所以我正在做...

SUBSTR('01-JAN-1970', 4)

...将日日期减少为月日期 ('JAN-1970'),这是为了与另一个 table 中发生的事情保持一致(to_date( ) 格式为 'non-yyyy' )

现在我们知道那里也有时间,当然它不会对齐,因为...

SUBSTR('01-JAN-1970 12:34', 4)

...产生 'JAN-1970 12:34' 然后这将与另一个 table 的任何东西都不匹配(没有时间就只是 'JAN-1970' ),所以左连接意味着将输出空值

解决方案是更改 SUBSTR 调用,使其从位置 4 开始剪切 8 个字符:

SUBSTR(start_time, 4, 8)

这将删除日期和时间,只留下我们需要的月-年。您需要在上面的查询中的两个地方进行更改..

很抱歉延迟回复此问题。但是,那是完美的 Caius,非常感谢!所以为了完整,必须将上面的代码更改为:

SUBSTR(START_TIME, 4, 8) as down_month,

GROUP BY SUBSTR(START_TIME, 4, 8)