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