如何使用count(*)获得结果总数?

时间:2017-03-10 16:03:02

标签: oracle11g

我需要得到每个人的总结果数量,但我得到......

resultado

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

1 个答案:

答案 0 :(得分:1)

您应该只选择实际要计算的非聚合列并进行分组。目前,您在每行中都包含fecha_hora_timbrefecha列,因此您需要计算这些列的唯一组合以及您实际需要的名称/部门信息数数。

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,则在一天之后使用>=<的上限应该会产生相同的效果。