oracle sql count(*) 行不匹配
oracle sql count(*) with rows not matched
我有一个 oracle 查询:
select to_char(te.HORA, 'hh24:mi') HORARIO, count(1) CANTIDAD
from db.t_error te
where (te.error LIKE 'ERR-108' or te.error LIKE 'ERR-256')
and te.HORA >= to_HORA('29-07-2016 18:50', 'dd-mm-yyyy hh24:mi')
and te.HORA <= to_HORA('29-07-2016 19:00', 'dd-mm-yyyy hh24:mi')
group by to_char(te.HORA, 'hh24:mi')
order by to_char(te.HORA, 'hh24:mi');
结果(Table):
HORARIO | CANTIDAD
18:53 2
18:56 2
18:58 1
18:59 1
但我需要包含所有分钟数的结果 (table):
HORARIO | CANTIDAD
18:50 0
18:51 0
18:52 0
18:53 2
18:54 0
18:55 0
18:56 2
18:57 0
18:58 1
18:59 1
19:00 0
每分钟计数 0 个值或计数 (1) 的结果不匹配。
希望有所帮助!
谢谢。
这不是一个好的解决方案(它应该被实现为直接与您的代码一起工作,而不是作为一个附加组件),但它说明了应该如何做到这一点。
to_date
在此上下文中将时间(使用 hh24:mi
格式模型)添加到当月的第一天,但您不关心这一点,因为您提取了小时和分钟并丢弃其余部分。
代码中需要修复的最大问题是使用字符串。最好将所有内容都放在日期数据类型中,按日期数据类型(到分钟)分组,并且只在最后使用 to_char()
用于显示目的。如果您需要这方面的帮助,请回信。
with
your_table ( horario, cantidad ) as (
select '18:53', 2 from dual union all
select '18:56', 2 from dual union all
select '18:58', 1 from dual union all
select '18:59', 1 from dual
),
all_times ( horario ) as (
select to_char( to_date('18:50', 'hh24:mi') + (level - 1) / (24 * 60), 'hh24:mi')
from dual
connect by level <= 1 + (to_date('19:00', 'hh24:mi') -
to_date('18:50', 'hh24:mi')) * 24 * 60
)
select a.horario, nvl(y.cantidad, 0) as cantidad
from all_times a left outer join your_table y
on a.horario = y.horario
order by horario
;
HORARIO CANTIDAD
------- ----------
18:50 0
18:51 0
18:52 0
18:53 2
18:54 0
18:55 0
18:56 2
18:57 0
18:58 1
18:59 1
19:00 0
11 rows selected.
已编辑:
对于 "cheap" 无需额外努力的解决方案,您可以将原始查询直接插入到 "your_table" 分解子查询中,就像这样(但我没有您的基表,所以我无法测试)。
with
your_table ( horario, cantidad ) as (
select to_char(te.HORA, 'hh24:mi') HORARIO, count(1) CANTIDAD
from db.t_error te
where (te.error LIKE 'ERR-108' or te.error LIKE 'ERR-256')
and te.HORA >= to_HORA('29-07-2016 18:50', 'dd-mm-yyyy hh24:mi')
and te.HORA <= to_HORA('29-07-2016 19:00', 'dd-mm-yyyy hh24:mi')
group by to_char(te.HORA, 'hh24:mi')
),
all_times ( horario ) as (
select to_char( to_date('18:50', 'hh24:mi') + (level - 1) / (24 * 60), 'hh24:mi')
from dual
connect by level <= 1 + (to_date('19:00', 'hh24:mi') -
to_date('18:50', 'hh24:mi')) * 24 * 60
)
select a.horario, nvl(y.cantidad, 0) as cantidad
from all_times a left outer join your_table y
on a.horario = y.horario
order by horario
;
我有一个 oracle 查询:
select to_char(te.HORA, 'hh24:mi') HORARIO, count(1) CANTIDAD
from db.t_error te
where (te.error LIKE 'ERR-108' or te.error LIKE 'ERR-256')
and te.HORA >= to_HORA('29-07-2016 18:50', 'dd-mm-yyyy hh24:mi')
and te.HORA <= to_HORA('29-07-2016 19:00', 'dd-mm-yyyy hh24:mi')
group by to_char(te.HORA, 'hh24:mi')
order by to_char(te.HORA, 'hh24:mi');
结果(Table):
HORARIO | CANTIDAD
18:53 2
18:56 2
18:58 1
18:59 1
但我需要包含所有分钟数的结果 (table):
HORARIO | CANTIDAD
18:50 0
18:51 0
18:52 0
18:53 2
18:54 0
18:55 0
18:56 2
18:57 0
18:58 1
18:59 1
19:00 0
每分钟计数 0 个值或计数 (1) 的结果不匹配。
希望有所帮助!
谢谢。
这不是一个好的解决方案(它应该被实现为直接与您的代码一起工作,而不是作为一个附加组件),但它说明了应该如何做到这一点。
to_date
在此上下文中将时间(使用 hh24:mi
格式模型)添加到当月的第一天,但您不关心这一点,因为您提取了小时和分钟并丢弃其余部分。
代码中需要修复的最大问题是使用字符串。最好将所有内容都放在日期数据类型中,按日期数据类型(到分钟)分组,并且只在最后使用 to_char()
用于显示目的。如果您需要这方面的帮助,请回信。
with
your_table ( horario, cantidad ) as (
select '18:53', 2 from dual union all
select '18:56', 2 from dual union all
select '18:58', 1 from dual union all
select '18:59', 1 from dual
),
all_times ( horario ) as (
select to_char( to_date('18:50', 'hh24:mi') + (level - 1) / (24 * 60), 'hh24:mi')
from dual
connect by level <= 1 + (to_date('19:00', 'hh24:mi') -
to_date('18:50', 'hh24:mi')) * 24 * 60
)
select a.horario, nvl(y.cantidad, 0) as cantidad
from all_times a left outer join your_table y
on a.horario = y.horario
order by horario
;
HORARIO CANTIDAD
------- ----------
18:50 0
18:51 0
18:52 0
18:53 2
18:54 0
18:55 0
18:56 2
18:57 0
18:58 1
18:59 1
19:00 0
11 rows selected.
已编辑:
对于 "cheap" 无需额外努力的解决方案,您可以将原始查询直接插入到 "your_table" 分解子查询中,就像这样(但我没有您的基表,所以我无法测试)。
with
your_table ( horario, cantidad ) as (
select to_char(te.HORA, 'hh24:mi') HORARIO, count(1) CANTIDAD
from db.t_error te
where (te.error LIKE 'ERR-108' or te.error LIKE 'ERR-256')
and te.HORA >= to_HORA('29-07-2016 18:50', 'dd-mm-yyyy hh24:mi')
and te.HORA <= to_HORA('29-07-2016 19:00', 'dd-mm-yyyy hh24:mi')
group by to_char(te.HORA, 'hh24:mi')
),
all_times ( horario ) as (
select to_char( to_date('18:50', 'hh24:mi') + (level - 1) / (24 * 60), 'hh24:mi')
from dual
connect by level <= 1 + (to_date('19:00', 'hh24:mi') -
to_date('18:50', 'hh24:mi')) * 24 * 60
)
select a.horario, nvl(y.cantidad, 0) as cantidad
from all_times a left outer join your_table y
on a.horario = y.horario
order by horario
;