我需要得到每个人的总结果数量,但我得到......
MY QUERY ..
select 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 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
预期数据......
NOMBRE | APELLIDO | DEPARTAMENTO_TRABAJA | VECES_MARCADAS(count) MARIA TARCILA IGLESIAS BECERRA ALCALDIA 4 KATHERINE TATIANA SEGOVIA FERNANDEZ ALCALDIA 10 FREDDY AGUSTIN VALDIVIESO VALLEJO ALCALDIA 3
UPDATE ..
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
答案 0 :(得分:1)
您应该只选择实际要计算的非聚合列并进行分组。目前,您在每行中都包含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
我删除了额外的列。请注意,它们已从选择列表和group-by子句中删除。如果选择列表中的非聚合列不在组中,则会出现ORA-00937错误;但是如果您在分组中有一个列不在选择列表中,那么即使您无法看到它,它仍会按此分组,但您只是没有获得结果期望的。
我也从旧式连接语法改为现代语法。我改变了日期比较;首先,因为trunc()
作为trunc(to_date('15/02/2017','dd/mm/yyyy'))
的一部分而做是没有意义的 - 你已经知道时间部分是午夜,所以截断并没有实现任何目标。但主要是因为如果fecha
上有索引可以使用索引。如果执行trunc(f.techa)
,则必须截断每个列值的值,这将停止使用的索引(除非您有基于函数的索引)。如果是between
,则在一天之后使用>=
和<
的上限应该会产生相同的效果。