Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Consulta SQL compleja de totales y medias
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Consulta SQL compleja de totales y medias

Publicar nuevo tema Responder al tema
Foros de discusión » MySQL Server, MySQL Client, motor de bd gratuito   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Consulta SQL compleja de totales y medias Responder citando

Estoy desarrollando una aplicación para controlar las tareas de mi departamento. Tengo la siguiente tabla:

Código:

CREATE TABLE `incidencia` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `codigotecnico` int(10) unsigned default NULL,
  `codigosubcategoria` int(10) unsigned default NULL,
  `tiempoempleado` int(10) unsigned default NULL,
  PRIMARY KEY  (`codigo`)
);


Esta otra:

Código:

CREATE TABLE `subcategoria` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `nombre` varchar(75) NOT NULL default '',
  PRIMARY KEY  (`codigo`),
  UNIQUE KEY `accion_nombre` (`nombre`)
);


y esta otra:
Código:

CREATE TABLE `usuario` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `nombre` varchar(100) default NULL,
  PRIMARY KEY  (`codigo`),
  UNIQUE KEY `usuario_nick` (`nick`)
);


(he omitido los campos que no son necesarios para mi pregunta)

Quisiera hacer un algoritmo de asignación automática, de forma que pueda obtener con una consulta SQL la suma de la media del "tiempoempleado" en resolver las incidencias que con el siguiente filtro:

* resueltatecnico='N'
* tiempoempleado is not null
* tiempoempleado <> 0

Lo que quiero sacar es algo así:

[Código Usuario] ----- [Nombre usuario] ----- [Número total incidencias] ---- [Suma del tiempo medio empleado en resolver las incidencias de la subcategoría de las incidencias no resueltas]

Consigo hacer esto:

Código:

select s.nombre Subcategoría, avg(i.tiempoempleado) "Tiempo medio"
from incidencia i, subcategoria s
where i.codigosubcategoria = s.codigo and tiempoempleado is not null and tiempoempleado<>0
group by i.codigosubcategoria


Que me muestra para cada subcategoría el tiempo medio empleado en resolverla.

Y esta otra:

Código:

select ii.codigotecnico Codigo_Tecnico, uu.nombre Usuario, count(*) Numero_Total,
   sum(ii.tiempoempleado)
from incidencia ii, usuario uu
where ii.codigotecnico = uu.codigo and ii.resueltatecnico = 'N'
group by ii.codigotecnico


Pero no me sirve porque me muestra el tiempo total empleado de las tareas no resueltas y estas no tienen tiempo total.
MensajePublicado:
Jue May 07, 2009 9:14 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Consulta SQL compleja de totales y medias Responder citando



Anuncios



varios escribió:
Estoy desarrollando una aplicación para controlar las tareas de mi departamento. Tengo la siguiente tabla:

Código:

CREATE TABLE `incidencia` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `codigotecnico` int(10) unsigned default NULL,
  `codigosubcategoria` int(10) unsigned default NULL,
  `tiempoempleado` int(10) unsigned default NULL,
  PRIMARY KEY  (`codigo`)
);


Esta otra:

Código:

CREATE TABLE `subcategoria` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `nombre` varchar(75) NOT NULL default '',
  PRIMARY KEY  (`codigo`),
  UNIQUE KEY `accion_nombre` (`nombre`)
);


y esta otra:
Código:

CREATE TABLE `usuario` (
  `codigo` int(10) unsigned NOT NULL auto_increment,
  `nombre` varchar(100) default NULL,
  PRIMARY KEY  (`codigo`),
  UNIQUE KEY `usuario_nick` (`nick`)
);


(he omitido los campos que no son necesarios para mi pregunta)

Quisiera hacer un algoritmo de asignación automática, de forma que pueda obtener con una consulta SQL la suma de la media del "tiempoempleado" en resolver las incidencias que con el siguiente filtro:

* resueltatecnico='N'
* tiempoempleado is not null
* tiempoempleado <> 0

Lo que quiero sacar es algo así:

[Código Usuario] ----- [Nombre usuario] ----- [Número total incidencias] ---- [Suma del tiempo medio empleado en resolver las incidencias de la subcategoría de las incidencias no resueltas]

Consigo hacer esto:

Código:

select s.nombre Subcategoría, avg(i.tiempoempleado) "Tiempo medio"
from incidencia i, subcategoria s
where i.codigosubcategoria = s.codigo and tiempoempleado is not null and tiempoempleado<>0
group by i.codigosubcategoria


Que me muestra para cada subcategoría el tiempo medio empleado en resolverla.

Y esta otra:

Código:

select ii.codigotecnico Codigo_Tecnico, uu.nombre Usuario, count(*) Numero_Total,
   sum(ii.tiempoempleado)
from incidencia ii, usuario uu
where ii.codigotecnico = uu.codigo and ii.resueltatecnico = 'N'
group by ii.codigotecnico


Pero no me sirve porque me muestra el tiempo total empleado de las tareas no resueltas y estas no tienen tiempo total.



Para lo que nos comentas, si lo hemos entendido bien, tendrás que utilizar subconsultas, sería algo así:

Código:

select ii.codigotecnico Codigo_Tecnico, uu.nombre Usuario, count(*) Numero_Total,
   sum((select avg(i.tiempoempleado)
    from incidencia i
    where tiempoempleado is not null and tiempoempleado <> 0
      and i.codigosubcategoria = ii.codigosubcategoria
    group by i.codigosubcategoria)) Tiempo_Total
from incidencia ii, usuario uu
where ii.codigotecnico = uu.codigo and ii.resueltatecnico = 'N'
group by ii.codigotecnico
order by Tiempo_Total asc, Numero_Total asc


Que te mostrará el código del técnico, el nombre del técnico, el número total de tareas pendientes de resolver, la suma de la media del tiempo empleado en "resolver" las tareas que tiene sin resolver y ordena el listado poniendo en primer lugar el técnico que mayor tiempo tiene.
MensajePublicado:
Jue May 07, 2009 9:18 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Consulta SQL compleja de totales y medias Responder citando



Anuncios



Como ves hemos puesto en el propio select otra subconsulta que sólo puede devolver un registro si no daría error (lógicamente), para ello hemos hecho el:

i.codigosubcategoria = ii.codigosubcategoria

De esta forma cogemos el valor actual del campo ii.codigosubcategoria de la consulta principal.

Como ves, MySQL (también válido para Oracle, SQL Server, etc.) permite multitud de combinaciones en las consultas SQL para hacer casi de todo con una única consulta SQL.
MensajePublicado:
Jue May 07, 2009 9:25 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » MySQL Server, MySQL Client, motor de bd gratuito  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A