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

[SOLUCIONADO] Resultados duplicados utilizando clausula DISTINCT

Estas en el tema de Resultados duplicados utilizando clausula DISTINCT en el foro de SQL Server en Foros del Web. Muy buenas. Estoy tratando de crear una vista que me muestre para cada tipo de usuario, la cantidad de problemas reportados, la fecha mas antigua ...
  #1 (permalink)  
Antiguo 10/07/2014, 18:26
 
Fecha de Ingreso: julio-2014
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
Resultados duplicados utilizando clausula DISTINCT

Muy buenas.

Estoy tratando de crear una vista que me muestre para cada tipo de usuario, la cantidad de problemas reportados, la fecha mas antigua en la que se resolvio un problema, y la fecha mas antigua en la que un problema quedo sin resolver.

La consulta la arme asi:
Código SQL:
Ver original
  1. ]SELECT DISTINCT u.user_tipo_codigo,(SELECT COUNT(p.problem_id)
  2. FROM problemas p
  3. WHERE u.user_id = p.user_id) AS cantproblemas, (SELECT MIN(fechahora_solucionado) FROM problemas p1, historia_problemas h
  4. WHERE p1.problem_id=h.problem_id
  5. AND fechahora_solucionado IS NOT NULL) AS fechaantiguasolucion, (SELECT MIN(problem_fechahora)                                                                                                       FROM problemas p2, historia_problemas h1                                                                                        WHERE p2.problem_id=h1.problem_id
  6. AND fechahora_solucionado IS NULL) AS fechaantiguasinsolucion
  7. FROM usuarios u

El problema es que me devuelve por ejemplo:

Admin, 0, 12/08/1991, 04/07/2014
Admin,16,12/08/1991,04/07/2014

y asi para cada tipo de usuario que tengo registrado en la tabla. Yo lo que quisiera es que me devolviera una fila por cada tipo de usuario

Estos son los campos que tienen las tablas que estoy usando:

Problemas (
[problem_id] INTEGER IDENTITY(1,1) NOT NULL,
[Equipamiento_id] INTEGER NOT NULL,
[user_id] INTEGER NOT NULL,
[problem_fechahora] DATETIME NOT NULL,
[problem_descrip] VARCHAR(255),
CONSTRAINT [PK_Problemas] PRIMARY KEY ([problem_id])
)

Historia_Problemas (
[Historia_Problemas_id] INTEGER IDENTITY(1,1) NOT NULL,
[codigo_nivel_prioridad] CHAR(20) NOT NULL,
[problem_id] INTEGER NOT NULL,
[problem_status_codigo] CHAR(20) NOT NULL,
[personal_asignado] INTEGER NOT NULL,
[fechahora_solucionado] DATETIME,
CONSTRAINT [PK_Historia_Problemas] PRIMARY KEY ([Historia_Problemas_id])
)

Usuarios (
[user_id] INTEGER IDENTITY(1,1) NOT NULL,
[user_tipo_codigo] CHAR(20) NOT NULL,
[user_nombre] VARCHAR(80),
[user_apellido] VARCHAR(80),
[user_telefono] VARCHAR(80),
[user_email] VARCHAR(80),
[user_direccion] VARCHAR(255),
[user_otros_datos] VARCHAR(255),
CONSTRAINT [PK_Usuarios] PRIMARY KEY ([user_id])
)

Les agradezco si me pudiese ayudar

Última edición por gnzsoloyo; 11/07/2014 a las 07:34
  #2 (permalink)  
Antiguo 11/07/2014, 07:33
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Resultados duplicados utilizando clausula DISTINCT

un pequeño ejemplo de tus datos ayudaria mas, lo que veo que puede estar pasando esque estas haciendo un producto cartesiano con tus datos y si quieres que sean 2 fechas debes de tratar los datos de manera diferente a como lo estas haciendo....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 11/07/2014, 07:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Resultados duplicados utilizando clausula DISTINCT

Recordemos siempre que DISTINCT, en todos los DBMS aplica a los registros completos devueltos tomados como un todo, y se consideran distintosdos registros si al menos una de las columnas entre dos registros dados contienen valores diferentes.
En ese sentido, lo que te devuelve es correcto porque la segunda columna no tienen los mismos valores:
Cita:
Admin, 0, 12/08/1991, 04/07/2014
Admin, 16, 12/08/1991, 04/07/2014
Así que desde esa óptica, son distintos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 12/07/2014, 18:35
 
Fecha de Ingreso: julio-2014
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Resultados duplicados utilizando clausula DISTINCT

Gracias a ambos por tomarse la molestia de responder.

Claro, aqui un ejemplo de mis inserts

Código SQL:
Ver original
  1. INSERT INTO tipos_usuario VALUES('Administrador','admin')
  2. INSERT INTO tipos_usuario VALUES('Gerente','Gerente')
  3. INSERT INTO tipos_usuario VALUES('Mando Medio','Mando medio')
  4. INSERT INTO tipos_usuario VALUES('Usuario Final','Usuario Final')
  5. INSERT INTO usuarios VALUES ('Administrador','Tim','Duncan','22117565','[email protected]','Wyoming 657','Administrador de Broken')
  6. INSERT INTO usuarios VALUES ('Gerente','Tony','Parker','24112342','[email protected]','18 de Julio 1524','Gerente de Crash')
  7.  
  8. INSERT INTO problemas VALUES(14,44,'14/04/2014','problema4')
  9. INSERT INTO historia_problemas VALUES ('Bajo',14,'Cerrado',8,getdate()-100)
[/CODE]

y como habia puesto mas arriba, el resultado de la vista, me da algo como esto:

user_tipo_codigo cantproblemas fechaantiguasolucion fechaantiguasinsolucion
Administrador 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Administrador 16 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 2 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Mando Medio 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Mando Medio 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Usuario Final 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Usuario Final 18 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000

gnzsoloyo, tienes razon en tu razonamiento, y la pregunta iba orientada a tratar de que me pudiesen orientar a que obtenga en el resultado los registros que no esten en 0.

Gracias

Última edición por gnzsoloyo; 12/07/2014 a las 18:59
  #5 (permalink)  
Antiguo 14/07/2014, 07:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Resultados duplicados utilizando clausula DISTINCT

y necesitas algo como esto de resultado:

user_tipo_codigo cantproblemas fechaantiguasolucion fechaantiguasinsolucion
Administrador 16 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Mando Medio 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Usuario Final 18 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000


Pero con estos registros que tienen 0 y mas de un valor con cual te quedarias???


Gerente 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 2 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 14/07/2014, 16:13
 
Fecha de Ingreso: julio-2014
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Resultados duplicados utilizando clausula DISTINCT

Hola Libras, gracias por la respuesta.

para el caso particular del Gerente, en realidad la consulta quisiera que me devolviese:

Gerente 3 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000 (o sea, la suma de los valores), pues estoy contando la cantidad de problemas que reportaron.

Me estara faltando hacer un sum, o de todas maneras el problema es de la manera que estoy tratando de resolver la consulta.

Gracias por la ayuda
  #7 (permalink)  
Antiguo 14/07/2014, 16:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Resultados duplicados utilizando clausula DISTINCT

si la vista te regresa estos datos:

user_tipo_codigo cantproblemas fechaantiguasolucion fechaantiguasinsolucion
Administrador 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Administrador 16 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Gerente 2 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Mando Medio 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Mando Medio 1 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Usuario Final 0 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000
Usuario Final 18 1900-01-01 00:00:00.000 2008-07-08 00:00:00.000

porque no haces algo como esto:

Código SQL:
Ver original
  1. SELECT user_tipo,SUM(cantproblemas) AS total,fechaantiguasolucion,fechaantiguasinsolucion
  2. FROM(
  3. SELECT * FROM vista) AS t1 GROUP BY user_tipo,fechaantiguasolucion,fechaantiguasinsolucion

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 15/07/2014, 21:04
 
Fecha de Ingreso: julio-2014
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Resultados duplicados utilizando clausula DISTINCT

Me sirvio. Muchisimas gracias por tu tiempo libras

Etiquetas: server, sql
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 10:24.