SQL报表-查询多个表

SQL报表-查询多个表,sql,oracle,apex,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 E

我一直在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
我想从另一个表中添加持续时间的总和:

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_调用使用DATELOGGED date作为日期标识符

IT_停机时间的当前输出为:

2019年2月8日-30分钟

2019年2月20日-15分钟

我希望报告汇总和分组,并将其添加到现有报告中

希望这是有意义的

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

非常感谢

谢谢你,非常感谢。不幸的是,它在停机时不会返回任何数据。 我猜不同的日期格式没有帮助,希望这能澄清一些问题:

以下是IT_停机时间中感兴趣的列: 开始时间VARCHAR230 持续时间间隔第2天至第6秒

当前未格式化的IT_停机输出示例:

开始时间

2016年7月6日11:05

持续时间

+00:35:00.000000

当前IT_支持_调用无格式输出的示例:

日期记录

2016年7月6日


像这样的东西可能会做到,但对于您的列名等,有一些猜测:

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,以使其与您声称的第二个查询dd MON yyy的varchar2日期格式一致,并将日期子字符串化以删除日期,只保留月份

编辑:

好的,既然你发布了一些不同的例子数据,我发现了问题:日期上也有时间。您的第一个示例数据这次没有包含,它只是一个字符串形式的日期,所以我正在做

SUBSTR('01-JAN-1970', 4)
…将日日期减少为月日期“1970年1月”,目的是与另一个表中的日期保持一致,格式为“非yyyy”

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

SUBSTR('01-JAN-1970 12:34', 4)
…生成'JAN-1970 12:34',这将与另一个表中的任何内容都不匹配,该表仅为'JAN-1970',没有时间,因此左连接意味着将输出空值

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

SUBSTR(start_time, 4, 8)

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

对于延迟回复此问题,深表歉意。然而,这是完美的工作凯乌斯,非常感谢!因此,为了完整,必须将上述代码更改为:

SUBSTR(START_TIME, 4, 8) as down_month,


请发布一些示例数据和所需结果,以澄清您需要的格式化文本,请说明什么数据类型是持续时间?停机时间表使用开始时间varchar2-这让我很难过。Oracle确实有日期数据类型..:/例如,IT的当前输出:-您发布的查询只选择了一列,因此无法生成您声称的输出,请解决此问题。@Caius Jard SQL不是我们的面包和黄油,只是我们在一旁做的事情。这些桌子自从15年前被匆忙摆放以来,从未被刷新过。谢谢你。不幸的是,它在停机时不会返回任何数据。将在IT_DOWNTIME表上进行扩展以使其更有意义,当前编辑的文本基于您所说的IT_DOWNTIME已包含的数据分组查询似乎不太可能不返回任何数据-请参见此示例,它使用您发布的确切数据,如您所料返回45分钟,链接:我编辑了我的原始帖子,希望能把事情弄清楚一点
GROUP BY SUBSTR(START_TIME, 4, 8)