SQL - Duda Group BY

   
Vista:

Duda Group BY

Publicado por Elmenda (5 intervenciones) el 13/05/2009 13:52:23
Alguien que me pueda explicar porque es obligatorio agrupar con todos los campos de la SELECT?

Por ejemplo con una consulta usando JOINS con varias tablas para obtener el recuento de prestamos de libros

SELECT P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION,COUNT(*) FROM PRESTAMO P, LIBRO L WHERE L.ISBN=P.ISBN
GROUP BY P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION

Me obligan a agrupar por todos los campos, y lo que obtengo como resultado es que solo me cuenta 1 por cada prestamo.

Y si solo lo agrupara por ISBN del libro, o por titulo me mostraria correctamente cuantas veces ha sido prestado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda Group BY

Publicado por DALSOM (197 intervenciones) el 13/05/2009 14:56:35
TU PROBLEMA ES EL count(*) QUE NECESITA UN AGRUPAMIENTO PARA CONTAR. SI LE QUITAS ESA FUNCION, Y EL group by HARA LO QUE DESEAS.

SI QUIERES Y ES OBLIGARIO, ENTONCES TENDRAS QUE HACER UN SUBQUERY SOLO PARA EL Count().

SALUDOS,
DALSOM.
REP. DOM.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda Group BY

Publicado por elmenda (5 intervenciones) el 13/05/2009 15:38:27
Toda la query era asi

SELECT P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION,COUNT(*) FROM PRESTAMO P, LIBRO L WHERE L.ISBN=P.ISBN
GROUP BY P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION
HAVING COUNT(*)>=ALL(SELECT COUNT(*) FROM SUCURSAL S, PRESTAMO P WHERE P.IDSUCURSAL=S.IDSUCURSAL GROUP BY S.IDSUCURSAL)

Se me olvido quitar el 1º count de la 1º subselect para hacerlo mas facil de comprender que de como realmente es la query
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda Group BY

Publicado por pacopaz (143 intervenciones) el 13/05/2009 21:14:37
Que es lo que quieres obtener? Las veces que una persona se ha llevado un libro? Si es así, te sobran las fechas. Si quieres que te indique la fecha desde y hasta cuando se ha llevado el libro, entonces la fecha de inicio debe estar calculada como la minima fecha y la fecha de devolucion deverá ser la máxima fecha y así puedes quitar del group by las fechas. Algo como esto:
SELECT P.ISBN, L.TITULO, P.NUMTARJETA, Min(P.FECHAINICIO), Max(P.FECHADEVOLUCION), COUNT(*) FROM PRESTAMO P, LIBRO L WHERE L.ISBN=P.ISBN
GROUP BY P.ISBN, L.TITULO, P.NUMTARJETA
HAVING COUNT(*)>=ALL(SELECT COUNT(*) FROM SUCURSAL S, PRESTAMO P WHERE P.IDSUCURSAL=S.IDSUCURSAL GROUP BY S.IDSUCURSAL)

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda Group BY

Publicado por Elmenda (5 intervenciones) el 13/05/2009 21:16:57
Lo que pido esta en el 1º mensaje, dos mas arriba.

"Alguien que me pueda explicar porque es obligatorio agrupar con todos los campos de la SELECT?

Por ejemplo con una consulta usando JOINS con varias tablas para obtener el recuento de prestamos de libros

SELECT P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION,COUNT(*) FROM PRESTAMO P, LIBRO L WHERE L.ISBN=P.ISBN
GROUP BY P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION

Me obligan a agrupar por todos los campos, y lo que obtengo como resultado es que solo me cuenta 1 por cada prestamo.

Y si solo lo agrupara por ISBN del libro, o por titulo me mostraria correctamente cuantas veces ha sido prestado. "
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda Group BY

Publicado por pacopaz (143 intervenciones) el 13/05/2009 21:32:43
Entonces no ocupas nada del número de tarjeta, ni de fechas, sólo el libro y cuantas veces fue prestado, cierto? Bueno, entonces, intenta con esto:
SELECT L.TITULO, COUNT(P.*)
FROM PRESTAMO P inner join LIBRO L on P.ISBN=L.ISBN
GROUP BY L.TITULO

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda Group BY

Publicado por Elmenda (5 intervenciones) el 14/05/2009 12:09:07
No si ya eso se que funciona, pero me obligan a añadir todos estos campos

P.ISBN,L.TITULO,P.NUMTARJETA,P.FECHAINICIO,P.FECHADEVOLUCION,COUNT(*)

y como tal a agruparlo tambien por todos esos campos, con lo que es diria imposible que contara el numero de libros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Duda Group BY

Publicado por roger (93 intervenciones) el 14/05/2009 15:30:33
se supone que estas contando basado en el ISBN, si incluyes el titulo el conteo se hará por ISBN tambien , y si hay un titulo distinto?, puede que en tu caso no sea asi, pero si eso pasa, que titulo va a mostrar?, solo puede mostrar un ISBN por que es agrupado, pero hay varios titulos por cada ISBN, cual conteo muestra????, asi mismo pasa con el resto de campos, algo que podrias hacer (creo que lo he visto por ahi), es que a cada campo de los que estas trayendo le pongas una funcion de agregado, como en tu caso se supone que son iguales, no tendras problema pues tendras los datos correctos

P.ISBN,MAX(L.TITULO),MAX(P.NUMTARJETA),MAX(P.FECHAINICIO),MAX(P.FECHADEVOLUCION),COUNT(*) from tablas group by P.ISBN

o tambien si tienes que traer todas esas columnas podrias hacer la seleccion normal de la tabla donde estan, y poner el conteo como una subconsulta o una funcion, y asi no tienes ni que hacer group by

De todas formas la cuestion del group by que comentas es un standar al que se acoge el sql server
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar