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

[SOLUCIONADO] Distinct? Group by? Having? Cual!!?

Estas en el tema de Distinct? Group by? Having? Cual!!? en el foro de SQL Server en Foros del Web. Hola amigos!!! Ante todo, muchas gracias por tomarse su tiempo de leerme y vamos al grano con mi problema. Tengo 2 tablas ARTICULOS y AUTORES. ...
  #1 (permalink)  
Antiguo 14/06/2013, 19:34
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Sonrisa Distinct? Group by? Having? Cual!!?

Hola amigos!!!
Ante todo, muchas gracias por tomarse su tiempo de leerme y vamos al grano con mi problema.

Tengo 2 tablas ARTICULOS y AUTORES. Obviamente, ARTICULOS contiene miles de artículos donde uno de sus campos es el autor y hay muchos artículos relacionados por cada autor.
Algo semejante a esto:

TABLA_AUTORES (id,nombre,foto)
1 - Primer Autor - 001
2 - Primer Autor - 002
3 - Primer Autor - 003

TABLA_ARTICULOS (id,Titulo,Autor,Fecha)
1 - Titulo uno - 1 - 14/06/2011
2 - Titulo uno - 1 - 13/06/2013
3 - Titulo uno - 1 - 12/04/2013
4 - Titulo uno - 2 - 02/06/2012
5 - Titulo uno - 2 - 25/05/2011
6 - Titulo uno - 1 - 04/06/2012
7 - Titulo uno - 1 - 10/04/2013
8 - Titulo uno - 3 - 01/05/2011
9 - Titulo uno - 3 - 02/01/2013
10 - Titulo uno - 3 - 21/02/2010
11 - Titulo uno - 1 - 17/06/2013

Bien, creo que se entiende... Ahora, necesito listar todos los autores pero con SOLO UN artículo asociado (uno aleatorio) y a su vez, éste artículo no puede tener una antigüedad mayor a tres meses.
Hace 3 días que voy pateando esta consulta y la tengo que resolver cuanto antes pero me estoy volviendo loco y no se como hacerla.. probe cursores, tablas temporales distinct (creo que podría solucionarse un poco por ahí, pero no puedo aplicar distinct al campo autor de la tabla artículos solamente (o no se cómo).
Obviamente soy bastante novato en SQL y me trabo en algunas consultas como éstas.
  #2 (permalink)  
Antiguo 15/06/2013, 11:05
 
Fecha de Ingreso: noviembre-2011
Mensajes: 48
Antigüedad: 13 años
Puntos: 5
Respuesta: Distinct? Group by? Having? Cual!!?

Ni distinct, ni having, ni group by. :)

Pruebalo.
Código SQL:
Ver original
  1. DROP TABLE #tabla_autores
  2. DROP TABLE #tabla_articulos
  3. CREATE TABLE #TABLA_AUTORES (id INT NOT NULL,nombre VARCHAR(30) NOT NULL,foto VARCHAR(3) NOT NULL)
  4. INSERT INTO #TABLA_AUTORES VALUES ( 1, 'Primer Autor', '001')
  5. INSERT INTO #TABLA_AUTORES VALUES ( 2, 'Primer Autor', '002')
  6. INSERT INTO #TABLA_AUTORES VALUES ( 3, 'Primer Autor', '003')
  7.  
  8. CREATE TABLE #TABLA_ARTICULOS (id INT NOT NULL,Titulo VARCHAR(30) NOT NULL, Autor INT NOT NULL, Fecha DATE NOT NULL)
  9.  INSERT INTO #TABLA_ARTICULOS VALUES (1, 'Titulo uno', 1, '2011/06/14')
  10.  INSERT INTO #TABLA_ARTICULOS VALUES (2 , 'Titulo uno' , 1 , '2013/06/13')
  11.  INSERT INTO #TABLA_ARTICULOS VALUES (3 , 'Titulo uno' , 1 , '2013/04/11')
  12.  INSERT INTO #TABLA_ARTICULOS VALUES (4 , 'Titulo uno' , 2 , '2012/06/02')
  13.  INSERT INTO #TABLA_ARTICULOS VALUES (5 , 'Titulo uno' , 2 , '2013/05/25')
  14.  INSERT INTO #TABLA_ARTICULOS VALUES (6 , 'Titulo uno' , 1 , '2012/06/04')
  15.  INSERT INTO #TABLA_ARTICULOS VALUES (7 , 'Titulo uno' , 1 , '2013/04/10')
  16.  INSERT INTO #TABLA_ARTICULOS VALUES (8 , 'Titulo uno' , 3 , '2011/05/01')
  17.  INSERT INTO #TABLA_ARTICULOS VALUES (9 , 'Titulo uno' , 3 , '2013/01/02')
  18.  INSERT INTO #TABLA_ARTICULOS VALUES (10 , 'Titulo uno' , 3 , '2010/02/12')
  19.  INSERT INTO #TABLA_ARTICULOS VALUES (11 , 'Titulo uno' , 1 , '2013/06/17')
  20.  
  21.  
  22. SELECT t3.Autor, t3.Titulo, T3.Fecha FROM (
  23. SELECT t1.Id Autor, t2.titulo, t2.Fecha, COUNT(t1.Id) OVER (PARTITION BY t2.autor) AS "Count" FROM #TABLA_AUTORES t1
  24. INNER JOIN #TABLA_ARTICULOS t2 ON t1.id = t2.autor AND t2.Fecha > CONVERT(DATE,Getdate()-91)) T3
  25. WHERE t3.COUNT = 1
  #3 (permalink)  
Antiguo 17/06/2013, 15:36
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Hola NullZ3r0, gracias por tu respuesta.. pero lamento decirte que no me funcionó. Después de acomodar el código para mi caso en particular me larga el siguiente error.

Error: Mens. 156, Nivel 15, Estado 1, Línea 12
Sintaxis incorrecta cerca de la palabra clave 'OVER'.

Te comento que también probé el código tal cual lo publicaste acá y tampoco funcionó.
Mi código:

Código SQL:
Ver original
  1. SELECT
  2.     T3.Autor,
  3.     T3.Titulo,
  4.     T3.Fecha
  5. FROM (
  6.     SELECT
  7.         T1.Id,
  8.         T1.Nombre,
  9.         T2.Titulo,
  10.         T2.Autor,
  11.         T2.Fecha,
  12.         COUNT(T1.Id) OVER (PARTITION BY T2.Autor) AS Cant
  13.     FROM
  14.         BcAutores T1 INNER JOIN BcArticulos T2 ON T1.Id = T2.Autor
  15.     WHERE
  16.         T2.Fecha > DATEADD(MONTH, -3, GETDATE())
  17.     ) T3
  18. WHERE T3.Cant = 1
  #4 (permalink)  
Antiguo 17/06/2013, 15:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Distinct? Group by? Having? Cual!!?

que version de sql server estas usando???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 17/06/2013, 16:14
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

SQL Server 2000
  #6 (permalink)  
Antiguo 17/06/2013, 16:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Distinct? Group by? Having? Cual!!?

no pues con razon...la funcion over() esta disponible desde sql server 2005 en adelante....

el resultado de Nullz3r0 sin over queda de la sig manera:
Código SQL:
Ver original
  1. SELECT t4.Autor, t4.Titulo, T4.Fecha FROM (
  2.  
  3. SELECT t1.Id Autor, t2.titulo, t2.Fecha,total
  4. FROM #TABLA_AUTORES t1
  5. INNER JOIN #TABLA_ARTICULOS t2 ON t1.id = t2.autor AND t2.Fecha > CONVERT(DATE,Getdate()-91)
  6. LEFT JOIN
  7. (SELECT COUNT(t1.id) total,t1.id FROM #TABLA_AUTORES t1
  8. INNER JOIN #TABLA_ARTICULOS t2 ON t1.id = t2.autor AND t2.Fecha > CONVERT(DATE,Getdate()-91)
  9. GROUP BY t2.autor,t1.id) t3 ON t1.id=t3.id
  10.  
  11.  
  12. ) T4
  13. WHERE t4.total = 1

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 17/06/2013, 16:48
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Cita:
Iniciado por Libras Ver Mensaje
no pues con razon...la funcion over() esta disponible desde sql server 2005 en adelante....

el resultado de Nullz3r0 sin over queda de la sig manera:
Código SQL:
Ver original
  1. SELECT t4.Autor, t4.Titulo, T4.Fecha FROM (
  2.  
  3. SELECT t1.Id Autor, t2.titulo, t2.Fecha,total
  4. FROM #TABLA_AUTORES t1
  5. INNER JOIN #TABLA_ARTICULOS t2 ON t1.id = t2.autor AND t2.Fecha > CONVERT(DATE,Getdate()-91)
  6. LEFT JOIN
  7. (SELECT COUNT(t1.id) total,t1.id FROM #TABLA_AUTORES t1
  8. INNER JOIN #TABLA_ARTICULOS t2 ON t1.id = t2.autor AND t2.Fecha > CONVERT(DATE,Getdate()-91)
  9. GROUP BY t2.autor,t1.id) t3 ON t1.id=t3.id
  10.  
  11.  
  12. ) T4
  13. WHERE t4.total = 1

saludos!
esta consulta me largó este error:

Mens. 107, Nivel 16, Estado 2, Línea 1
El prefijo de columna 't3' no coincide con un nombre de tabla o con un alias usado en la consulta.
Mens. 107, Nivel 16, Estado 2, Línea 1
El prefijo de columna 't3' no coincide con un nombre de tabla o con un alias usado en la consulta.
Mens. 107, Nivel 16, Estado 2, Línea 1
El prefijo de columna 'T3' no coincide con un nombre de tabla o con un alias usado en la consulta.
  #8 (permalink)  
Antiguo 17/06/2013, 17:04
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Distinct? Group by? Having? Cual!!?

la ejecutaste tal cual?? puedes poner el codigo que usaste que te mando ese error?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 17/06/2013, 21:04
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Cita:
Iniciado por Libras Ver Mensaje
la ejecutaste tal cual?? puedes poner el codigo que usaste que te mando ese error?
Si, la ejecuté tal cual la publicaste. Copié el código que me pasaste y lo pegué sin hacerle ni una modificación. Luego intenté hacer algunas modifiaciones para ver si funcionaba y tampoco. Esto me esta frustrando
Alguna idea? Muchas gracias de antemano!
  #10 (permalink)  
Antiguo 18/06/2013, 07:21
 
Fecha de Ingreso: noviembre-2011
Mensajes: 48
Antigüedad: 13 años
Puntos: 5
Respuesta: Distinct? Group by? Having? Cual!!?

El código de Libras funciona muy bien, pon el código que ejecutaste.
  #11 (permalink)  
Antiguo 18/06/2013, 15:26
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Estuve haciendo diferentes pruebas y no logro solucionarlo.. usé el código de ambos sin modificacion alguna, para la primer parte la de NullZ3r0 para crear las tablas e insertar los datos:

Código SQL:
Ver original
  1. DROP TABLE #tabla_autores
  2. DROP TABLE #tabla_articulos
  3. CREATE TABLE #TABLA_AUTORES (id INT NOT NULL,nombre VARCHAR(30) NOT NULL,foto VARCHAR(3) NOT NULL)
  4. INSERT INTO #TABLA_AUTORES VALUES ( 1, 'Primer Autor', '001')
  5. INSERT INTO #TABLA_AUTORES VALUES ( 2, 'Primer Autor', '002')
  6. INSERT INTO #TABLA_AUTORES VALUES ( 3, 'Primer Autor', '003')
  7.  
  8. CREATE TABLE #TABLA_ARTICULOS (id INT NOT NULL,Titulo VARCHAR(30) NOT NULL, Autor INT NOT NULL, Fecha DATE NOT NULL)
  9.  INSERT INTO #TABLA_ARTICULOS VALUES (1, 'Titulo uno', 1, '2011/06/14')
  10.  INSERT INTO #TABLA_ARTICULOS VALUES (2 , 'Titulo dos' , 1 , '2013/06/13')
  11.  INSERT INTO #TABLA_ARTICULOS VALUES (3 , 'Titulo tres' , 1 , '2013/04/11')
  12.  INSERT INTO #TABLA_ARTICULOS VALUES (4 , 'Titulo cuatro' , 2 , '2012/06/02')
  13.  INSERT INTO #TABLA_ARTICULOS VALUES (5 , 'Titulo cinco' , 2 , '2013/05/25')
  14.  INSERT INTO #TABLA_ARTICULOS VALUES (6 , 'Titulo seis' , 1 , '2012/06/04')
  15.  INSERT INTO #TABLA_ARTICULOS VALUES (7 , 'Titulo siete' , 1 , '2013/04/10')
  16.  INSERT INTO #TABLA_ARTICULOS VALUES (8 , 'Titulo ocho' , 3 , '2011/05/01')
  17.  INSERT INTO #TABLA_ARTICULOS VALUES (9 , 'Titulo nueve' , 3 , '2013/01/02')
  18.  INSERT INTO #TABLA_ARTICULOS VALUES (10 , 'Titulo diez' , 3 , '2010/02/12')
  19.  INSERT INTO #TABLA_ARTICULOS VALUES (11 , 'Titulo once' , 1 , '2013/06/17')

el cual originalmente me tira este error:

Mens. 2715, Nivel 16, Estado 7, Línea 8
Columna o parámetro nº 4: no se encuentra el tipo de datos date.


Por lo que cambié el tipo de campo de DATE a DATETIME y así se ejecutó pero algunas filas no las insertó dando el siguiente error:

Mens. 242, Nivel 16, Estado 3, Línea 9
La conversión del tipo de datos char a datetime produjo un valor datetime fuera de intervalo.


Esto hizo que no insertara las filas con ID 1,2,5 y 11, dejando sólo 7 filas en #TABLA_ARTICULOS

Esto no era gran problema, ya que haciendo esa pequeña modificación me creo 2 tablas con contenido similar a lo que necesitaba. Pero al ejecutar el query de Libras me tiró el siguiente error:

Mens. 243, Nivel 16, Estado 1, Línea 1
date no es un tipo de sistema definido.


Luego cambie DATE por DATETIME y la consulta se ejecuta sin problemas, pero no me larga ningún resultado
  #12 (permalink)  
Antiguo 19/06/2013, 01:45
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 15 años, 1 mes
Puntos: 7
Respuesta: Distinct? Group by? Having? Cual!!?

Por que no intentas esto (suponiendo que tu relacion sea de uno [autores] a muchos [articulos] ):

Código SQL:
Ver original
  1. DROP TABLE #tabla_autores
  2. DROP TABLE #tabla_articulos
  3. CREATE TABLE #TABLA_AUTORES (id INT NOT NULL,nombre VARCHAR(30) NOT NULL,foto VARCHAR(3) NOT NULL)
  4. INSERT INTO #TABLA_AUTORES VALUES ( 1, 'Primer Autor', '001')
  5. INSERT INTO #TABLA_AUTORES VALUES ( 2, 'segundo Autor', '002')
  6. INSERT INTO #TABLA_AUTORES VALUES ( 3, 'tercer Autor', '003')
  7.  
  8. CREATE TABLE #TABLA_ARTICULOS (id INT NOT NULL,Titulo VARCHAR(30) NOT NULL, Autor INT NOT NULL, Fecha datetime NOT NULL)
  9.  INSERT INTO #TABLA_ARTICULOS VALUES (1, 'Titulo uno', 1, '2011/06/14')
  10.  INSERT INTO #TABLA_ARTICULOS VALUES (2 , 'Titulo 2' , 1 , '2013/06/13')
  11.  INSERT INTO #TABLA_ARTICULOS VALUES (3 , 'Titulo 3' , 1 , '2013/04/11')
  12.  INSERT INTO #TABLA_ARTICULOS VALUES (4 , 'Titulo 1' , 2 , '2012/06/02')
  13.  INSERT INTO #TABLA_ARTICULOS VALUES (5 , 'Titulo 2' , 2 , '2013/05/25')
  14.  INSERT INTO #TABLA_ARTICULOS VALUES (6 , 'Titulo 4' , 1 , '2012/06/04')
  15.  INSERT INTO #TABLA_ARTICULOS VALUES (7 , 'Titulo 5' , 1 , '2013/04/10')
  16.  INSERT INTO #TABLA_ARTICULOS VALUES (8 , 'Titulo 1' , 3 , '2011/05/01')
  17.  INSERT INTO #TABLA_ARTICULOS VALUES (9 , 'Titulo 2' , 3 , '2013/01/02')
  18.  INSERT INTO #TABLA_ARTICULOS VALUES (10 , 'Titulo 3' , 3 , '2010/02/12')
  19.  INSERT INTO #TABLA_ARTICULOS VALUES (11 , 'Titulo 6' , 1 , '2013/06/17')
  20.  
  21.  
  22.  
  23. SELECT A.nombre
  24.     , isnull((SELECT top 1 Titulo FROM #TABLA_ARTICULOS B WHERE B.Autor=A.id AND B.Fecha > CONVERT(datetime,Getdate()-91) ORDER BY newid()),'') AS Titulo
  25. FROM #tabla_autores A
  #13 (permalink)  
Antiguo 19/06/2013, 09:33
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Joch_pa, tu código se ejecutó sin problemas. El problema de las fechas es porque estaban intercambiados DIA y MES. Aún así, el tercer resultado (autor) no debería aparecer ya que no hay ningún artículo asociado a el dentro de esa fecha. Debería repetir el SELECT en el WHERE? Ahí si me funciona como yo necesito pero no se si sería lo más óptimo.
Por otro lado, necesito también otros campos de #TABLA_ARTICULOS, por lo que cuando incluyo en la subconsulta me larga el error:

Sólo se puede especificar una expresión en la lista de selección cuando la subconsulta no se especifica con EXISTS.

Gracias de todas formas!!!

Última edición por raulalva3; 19/06/2013 a las 09:52
  #14 (permalink)  
Antiguo 19/06/2013, 13:25
Avatar de raulalva3  
Fecha de Ingreso: julio-2005
Ubicación: San Juan - Argentina
Mensajes: 44
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: Distinct? Group by? Having? Cual!!?

Hola amigos! Muchas gracias por su atención y su preciado tiempo. Creo que lo solucioné. Ahora, me gustaría copiar el código acá para ver si le pueden pegar una mirada para ver si hay algo que se me esté pasando por alto o algún problema que me pueda surgir a futuro.
Muchas gracias!

Código SQL:
Ver original
  1. SELECT
  2.     A.Id,
  3.     A.Nombre,
  4.     A.Imagen,
  5.     B.Id,
  6.     B.Titulo,
  7.     B.Fecha
  8. FROM
  9.     BcAutores AS A LEFT JOIN BcArticulos AS B ON A.Id = B.Autor
  10. WHERE
  11.     B.Id = (
  12.             SELECT TOP 1
  13.                 Id
  14.             FROM
  15.                 BcArticulos AS C
  16.             WHERE
  17.                 C.Autor = A.Id AND
  18.                 C.Fecha > DATEADD(MONTH, -3, GETDATE()) AND
  19.                 C.Publicar = 1 AND
  20.                 C.Categoria = 10
  21.             ORDER BY
  22.                 NEWID()
  23.             ) AND
  24.     A.Id IN (3,4,5,6,7,10,11,12,14,17,20,26)
  25. ORDER BY
  26.     A.Id ASC

Etiquetas: campos, distinct, group, 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 11:50.