SQL报表-查询多个表

时间:2019-03-14 11:20:37

标签: sql oracle apex

我一直在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

我希望从另一个表中添加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_DOWNTIME表使用START_TIME(varchar2)作为日期标识符,IT_SUPPORT_CALLS使用DATELOGGED(DATE)作为日期标识符。

例如,IT_DOWNTIME的当前输出为:

08-FEB-2019-30分钟

20-FEB-2019-15分钟

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

希望这很有道理。

请让我知道是否错过任何有助于解决此问题的信息。

非常感谢

非常感谢。不幸的是,它没有从IT_DOWNTIME返回任何数据。 我猜想不同的日期格式无济于事,希望这可以使事情更简单:

以下是IT_DOWNTIME中值得关注的列: START_TIME(VARCHAR2(30)) 持续时间(间隔天(2)至第二(6))

当前未格式化的IT_DOWNTIME输出示例:

  

START_TIME

     
    

2016年6月6日11:05

  
     

DURATION

     
    

+00 00:35:00.000000

  

当前IT_SUPPORT_CALLS输出而不进行格式化的示例:

  

已记录日期

     
    

2016年6月7日

  

2 个答案:

答案 0 :(得分:0)

类似的事情也许可以做到,但是对于您的列名等却有些猜测:

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'),这是为了与另一张表(to_date()中发生的事情,格式为'non-yyyy'一致) )

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

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

...产生“ JAN-1970 12:34”,然后它将与其他表中的任何内容都不匹配(没有时间的情况下仅为“ JAN-1970”),因此左联接表示空值将输出

解决方案是更改SUBSTR调用,以便从第4位开始削减8个字符:

SUBSTR(start_time, 4, 8)

这将删除日期和时间,只剩下我们需要的月份。您需要在上面的查询中的两个位置进行更改。

答案 1 :(得分:0)

对于延迟回复表示歉意。但是,这很正常,Caius,非常感谢!为了完整起见,必须将您上面的代码更改为:

SUBSTR(START_TIME, 4, 8) as down_month,

GROUP BY SUBSTR(START_TIME, 4, 8)