Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Utilizando Distinct junto con Group By

Estas en el tema de Utilizando Distinct junto con Group By en el foro de Mysql en Foros del Web. Buenas Tardes gente, esta ocasión vengo por que me he encontrado con un desafío. Estoy viendo el sistema bibliotecario de una institución educativa y me ...
  #1 (permalink)  
Antiguo 17/08/2012, 14:51
 
Fecha de Ingreso: diciembre-2009
Ubicación: San Salvador, El Salvador
Mensajes: 20
Antigüedad: 14 años, 11 meses
Puntos: 0
Pregunta Utilizando Distinct junto con Group By

Buenas Tardes gente,
esta ocasión vengo por que me he encontrado con un desafío.
Estoy viendo el sistema bibliotecario de una institución educativa y me han dejado de realizar unas estadísticas sobre el uso de los recursos bibliotecarios.

Detallo el problema que tengo acontinuación.

Tengo la tabla PRESTAMOS donde se almacenan los registros de los libros que han sido prestados junto con los datos respectivos, id del usuario que lo prestó, la fecha en q se prestó, la hora, y la fecha en que debe de entregarlo...

Ahora bien hay una tabla que contiene los libros, la tabla se llama obras, entonces cada obra tiene su clasificación de 0, 1, 2, 3, 4, 5 hasta 9 o más.

Con estos datos debo de obtener la cantidad de usuarios que realizaron préstamos en un rango de fechas (fecha_inicio y fecha_fin), teniendo en cuenta que cada usuario puede realizar 3 consultas diarias.

Ahora bien, tengo que mostrar una tabla ordenada y agrupada según la clasificación de los libros, seguido de la cantidad de Usuarios únicos, sin repetir, que prestaron libros y luego la cantidad de libros que fueron prestados, quedando asi el resultado que deseo obtener.

No | Categoría | Cantidad de Usrs | Cantidad de Préstamos
________________________________________________
1 | 0 | 512 | 1020
2 | 1 | 50 | 212
3 | 2 | 10 | 50
4 | 3 | 23 | 72

etc etc etc

Hoy viene el problema, recordemos que los usuarios pueden realizar prestamos de cualquier categoria, categoría 1, Categoria 2.. de todas las que existan
Al hacer la consulta, me debe de dar Cierta cantidad, pero el problema es que me duplica los ids de los usuasio, por que si un usuario prestó un libro de la categoría 0 me lo agrega a la cantidad de usuarios, pero cuando ese mismo usuarios presta otro libro de la categoría 2, me lo suma de nuevo y asi pasa cuando ese mismo usuario presta un libro de la categoria 3, asi como les explico me acaba de sumar 2 veces mas el Id de ese usuario, entonces deseo saber si hay una manera de poder obtener el id del usuario, solo una vez sin que se sume en las demás categorías, para poder obtener el número exacto

he empezado a armar el query y lo que tengo hasta este momento es lo siguiente:

Código:
SELECT count(obras.clasifica) cantidad, substring(obras.clasifica,1,1) categoria, count(distinct usrs.idusr) cantidad_usrs
FROM prestamos
INNER JOIN catalogo ON prestamos.idcat = catalogo.idcat
INNER JOIN obras ON catalogo.idobra = obras.idobra
INNER JOIN usrs ON usrs.idusr = prestamos.idusr
INNER JOIN cooperante on cooperante.id = usrs.idcooperante
WHERE substring(prestamos.dateadd,1,10) >='2012-06-01' AND substring(prestamos.dateadd,1,10) <='2012-07-31' and cooperante.id='1'
and usrs.eliminado = 0
GROUP BY substring(obras.clasifica,1,1);
Espero su ayuda por favor, en si lo que deseo hacer
es obtener los usuarios agrupados por categoría pero que si un mismo usuario tiene un registro a otra categoria no lo tome en cuenta el mysql,

es algo complicado toda esta explicación, pero espero haya sido de ayuda para comentarles mi caso y espero su ayuda,

gracias de antemano
  #2 (permalink)  
Antiguo 17/08/2012, 15:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Utilizando Distinct junto con Group By

Creo que la lógica de la consulta está bien, pero no sé por qué usas esos substring. Si agrupas por categoria sin más y con algo así, debería salirte lo que buscas.
SELECT categoria, COUNT( categoria ) , COUNT( DISTINCT users ) , COUNT( * )
FROM `tabla`
GROUP BY categoria

Es decir, no uses ese substring para agrupar, sino el campo categoria.
  #3 (permalink)  
Antiguo 17/08/2012, 15:45
 
Fecha de Ingreso: diciembre-2009
Ubicación: San Salvador, El Salvador
Mensajes: 20
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Utilizando Distinct junto con Group By

Hola jurena, el substring lo uso por que las categorias poseen mas de 1 caracter, tienen valores decimales, 620.0044 que con el substring seria igual a 6, 547 que con el substring sería 5, y asi con cada uno de ellas, por eso necesito usarlas, pero lo que deseo hacer es obtener valores únicos, aunque el usuario haya prestado libros de diferentes categorías, sólo se me cuente una vez, es decir en la primera categoria, en las demas que le siguen no, porque me vuelve a contar a ese usuario y asi es como me duplica los valores y eso hace que me incremente el valor total :(
  #4 (permalink)  
Antiguo 18/08/2012, 04:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Utilizando Distinct junto con Group By

Pues la consulta que te propuse, esa que hice sobre unos datos creados por mí, me da el resultado correcto. A saber, si alguien presta en dos categorías, aparece como unidad sumada en el total de cada uno de ellos, y no dos veces en cada una de ellas. Y así es como debe ser. Si lo que buscas es el total de valores únicos no puedes usar esa consulta. Si lo que quieres es el número de usuarios único independiente de las categorías, te bastará con un SELECT COUNT(DISTINCT idusrs) totalusuariosunicos FROM prestamos

Etiquetas: distinct, group, join, junto, registros, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:38.