Los Foros de ASPTutor.com
Home | Perfil | Registrarse | Temas Activos | Miembros | Buscar | FAQ
Usuario:
Password:
 Todos los Foros
 ADO
 SELECT complicada
 Foro Bloqueado  Tema Bloqueado


Autor Temas
N-iceman
Junior Member

España
180 Posts
Mensajes - 17 Jun 2002 :  12:15:19  Ver Perfil  Enviar Email
Tengo una BD SQL Server y tengo en ella diversos registros con un campo en común.
Cada registro es un día de vacaciones, por lo que cada grupo de registros son las vacaciones de una persona.

Quiero hacer una select que me dé un registro para cada persona con el campo fechainicio del 1er día y el campo fechafin del último día.

Los campos de la tabla son:
id (autonumérico y PK)
DNI
Nombre
Numero de Dep (FK)
fechaini
fechafin

Alguien me puede dar una ide ade como usar GROUP BY para hacer esta SELECT, porque me de errores de narices! me pone:

Server: Msg 8120, Level 16, State 1, Line 1
Column 'peticiones.nip' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Server: Msg 8121, Level 16, State 1, Line 1
Column 'peticiones.motivo' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.

Y seguro que está tirado, pero me temo que tengo el SQL un poco oxidado...

Gracias!

N-iceman
Junior Member

España
180 Posts
Posted - 17 Jun 2002 :  12:39:19  Ver perfil  Enviar e-mail
De hecho, la select ya me funciona...

Lo que ocurre es que hay un campo que es un dato tipo bit que no me lo acepta... necesito aplicarle una función de agregación o ponerlo en el group by y no me lo permite...

Alguna idea?

Inicio Pagina

nicolas
New Member

España
74 Posts
Posted - 18 Jun 2002 :  17:52:40  Ver perfil  Enviar e-mail
Los errores que te aparecen, efectivamente tienen que ver con el intento de poner en una consulta de agrupación referencias a campos que o bien no están en el "group by" o no aparecen como argumentos de funciones de agregados (sum, count, etc.). En cualquier caso, estos errores hacen referencia a campos (peticiones.nip y peticiones.motivo), que no están en la tabla que describes al principio (supongo que haces una join y sobre ella agrupas). Por cierto, también dices "cada registro es un día de vacaciones"; si es así, no entiendo para que guardas "fechaini" y "fechafin", a menos que lo que guardes sea un rango de días. Si quieres, dame la estructura de las tablas que intervienen en la consulta de agrupación (tipos de campo incluidos), y quizás pueda serte de más ayuda.

Nicolás Sánchez Ruiz
ESI BarcelonaInicio Pagina

N-iceman
Junior Member

España
180 Posts
Posted - 18 Jun 2002 :  18:31:01  Ver perfil  Enviar e-mail
Gracias por tus consejos Nicolás...

La consulta la solucioné,pero no sé si es correcta... he metido todos los campos en "group by" y me da una select correcta,perono he usado la CLAUSULA JOIN...

Lo de los 2 campos de fecha es necesario porque me lo han pedido así (hay 3 casos especiales en que se trata la cosa diferente y se da un registro por varios días), y uno, como es un mandao...

El caso es que no sé si la SELECT SERÁ CORRECTA COMO LA HE HECHO...

Te la adjunto:

select
p.nip, empleado, motivo, min(fechaini), max(fechafin), min(horaini),max(horafin),
jorncomp, observaciones,autorgest, t.nombre as Gestor, estado,autoraut, e.nombre as Autorizador, justificado,autorjust, j.nombre

from peticiones p, empleados e, empleados t, empleados j

where p.nip = 368 and autoraut = e.nip and autorgest = t.nip and autorjust = j.nip

group by
justific_num, motivo,observaciones,autorgest, t.nombre, estado,autoraut, e.nombre,justificado,autorjust,j.nombre,p.nip,empleado, jorncomp

Juega con 2 tablas, pero la tabla peticiones, que es en la que se hace la select principal tiene la estructura siguiente:

NIP (int)
Empleado (varchar)
Motivo (int)
fechaini(datetime)
fechafin(datetime)
horaini(datetime)
horafin(datetime)
autoraut(int)
autorgest(int)
autorjust(int)
justificado(tinyint)
estado(tinyint)
observaciones(varchar)
jorncomp(tinyint)

Los tinyint eran bit algunos de ellos,pero SQL no permite agrupar valores tipo bit.

ESpero queno necesites nada más!

Gracias!

Inicio Pagina

nicolas
New Member

España
74 Posts
Posted - 18 Jun 2002 :  20:20:00  Ver perfil  Enviar e-mail
Bueno... pues la consulta (bastante sofisticada, por cierto), creo que está bien. Realmente, haces una join entre peticiones y empleados (3 veces), para recuperar los nombres del gestor y el autorizador (supongo), además del propio empleado de la petición; esa join se hace implícitamente en la línea:

where p.nip = 368 and autoraut = e.nip and autorgest = t.nip and autorjust = j.nip

...quizás (por claridad), podrías calificar todas las columnas:
where p.nip = 368 and p.autoraut = e.nip and p.autorgest = t.nip and p.autorjust = j.nip

Esto es la join, aunque en SQL server, desde las últimas versiones existe el operador explícito de JOIN; tiene algunas diferencias muy sutiles respecto al implícito que has utilizado, pero creo que no afectan para nada a tu consulta.

Respecto a los tipos de campo que puedes utilizar para agrupaciones (y ordenaciones), los comportamientos varían de una base de datos a otro; pero suele ser normal no poder hacerlo por algunos campos (bit, blob, memo, etc,). Si necesitas esos campos en el resultado, quizás tendrás que cambiar los tipos, como creo que ya has hecho.

Nicolás Sánchez Ruiz
ESI BarcelonaInicio Pagina

N-iceman
Junior Member

España
180 Posts
Posted - 18 Jun 2002 :  20:26:16  Ver perfil  Enviar e-mail
El problema es que me da miedo haber hecho una consulta que se me coma registros o que me de redundancia...

Es eso posible con la select que he hecho?

Sabes qué pasa? Que la select la he hecho... digamos que con un método de razponamineto muy estructurado y eso puede hacer que se me escapen cosas...

Básicamente! Que la select creo que está bien perono tenmgo ni pajotera idea de cómo me las he montado para sacarla!

Crees que podrías responderme a ésto de si habrá redundancia o no según el planteamiento que se da en la select?

Ósea, quizás si puedes hacer un breve recorrido por ella, y mela comentas un poquillo sólo para ver si se me puede haber escapado algo...

Es una petición un tanto extraña, verdad?

En fín, gracias por la ayuda prestada!

Inicio Pagina

   
 Foro Bloqueado  Tema Bloqueado
Ir a:
Los Foros de ASPTutor.com Los Foros de ASPTutor.com
Ir al principio de la Página

 Imprimir Tema
 

Descargas de manuales¦ Ejemplos de código ¦ Artículos mas visitados ¦ Envía tu articulo ¦ Foros ¦
  Libro de visitas ¦Crea un enlace con ASPTutor 
 

    © 2001-Hasta hoy  Pedro Rufo Martín  contactar