我需要获得每个人的结果总数,但我得到......
结果
我的查询..
选择 t.fecha_hora_timbre,e.nombre,e.apellido,d.descripcion as departamento_trabaja, t.fecha,count(*) From fulltime.timbre t, fulltime.empleado e, fulltime.departamento d 其中 d.depa_id=e.depa_id 和 t.codigo_empleado=e.codigo_empleado 和 trunc(t.fecha) 介于 trunc(to_date('15/02/2017','dd/mm/yyyy')) 和 trunc(to_date('14/03/2017','dd/mm/yyyy')之间) 分组按t.fecha_hora_timbre,e.nombre,e.apellido,d.descripcion,t.fecha
预期数据...
诺姆布雷 |阿佩利多 |DEPARTAMENTO_TRABAJA |VECES_MARCADAS(计数) 玛丽亚·塔西拉·伊格莱西亚斯·贝塞拉·阿尔卡尔迪亚 4 凯瑟琳·塔蒂亚娜·塞戈维亚 费尔南德斯·阿尔卡尔迪亚 10 弗雷迪·奥古斯丁·瓦尔迪维索·瓦列霍·阿尔卡尔迪亚 3
更新。
select e.nombre,e.apellido,d.descripcion as departamento_trabaja,COUNT(*)
from fulltime.timbre t, fulltime.empleado e, fulltime.departamento d
where d.depa_id=e.depa_id and t.codigo_empleado=e.codigo_empleado and
trunc(t.fecha) between trunc(to_date('15/02/2017','dd/mm/yyyy')) and trunc(to_date('14/03/2017','dd/mm/yyyy'))
group by t.fecha_hora_timbre,e.nombre,e.apellido,d.descripcion, t.fecha
您应该只选择并按您实际要计数的非聚合列进行分组。目前,您在每行中包含fecha_hora_timbre
和fecha
列,因此您正在计算这些列的唯一组合以及您实际想要计算的名称/部门信息。
select e.nombre, e.apellido, d.descripcion as departamento_trabaja,
count(*) a veces_marcadas
from fulltime.timbre t
join fulltime.empleado e on t.codigo_empleado=e.codigo_empleado
join fulltime.departamento d on d.depa_id=e.depa_id
where t.fecha >= to_date('15/02/2017','dd/mm/yyyy')
and t.fecha < to_date('15/03/2017','dd/mm/yyyy')
group by e.nombre, e.apellido, d.descripcion
我已经删除了多余的列。请注意,它们已从选择列表和分组依据子句中消失。如果选择列表中有一个不在分组依据中的非聚合列,则会收到 ORA-00937 错误;但是,如果您在 Group-By 中有一列不在选择列表中,那么即使您看不到它并且您不会得到预期的结果,它仍然会按该列进行分组。
我还从旧式联接语法更改为现代语法。我已经更改了日期比较;首先,因为将trunc()
作为trunc(to_date('15/02/2017','dd/mm/yyyy'))
的一部分是没有意义的 - 您已经知道时间部分是午夜,因此 trunc 没有任何效果。但主要是这样,如果fecha
上有一个索引,则可以使用该索引。如果执行trunc(f.techa)
则必须截断每个列值的值,这将停止使用索引(除非您有基于函数的索引)。正如between
在包容性中一样,使用>=
和<
,一天后达到上限应该总体上具有相同的效果。