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

Valores más usados en una consulta

Estas en el tema de Valores más usados en una consulta en el foro de SQL Server en Foros del Web. Estimados, Soy nuevo en éste foro y estoy buscando alternativas para algo que aparéntemente es fácil, sin embargo no he podido concretarlo. Como ejemplo pongo ...
  #1 (permalink)  
Antiguo 03/07/2014, 12:38
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Valores más usados en una consulta

Estimados,

Soy nuevo en éste foro y estoy buscando alternativas para algo que aparéntemente es fácil, sin embargo no he podido concretarlo.

Como ejemplo pongo la siguiente tabla que contiene la siguiente estructura

Persona Color Veces utilizado
Raul Negro 3
Alberto Verde 4
Carlos Rojo 5
Carlos Amarillo 2
Alberto Gris 3
Isabel Azul 4
Manuel Rojo 5
Carlos Negro 1
Raul Azul 6

De la cual requiero hacer un select el cual únicamente me dé el color más utilizado por X persona por ejemplo.

Raul -- Azul -- 6
Alberto -- Verde -- 4

Tengo el siguiente query para obtener los máximos, sin embargo me entrega todos los valores.

Código SQL:
Ver original
  1. SELECT Persona, color,  MAX(Veces_utilizado) AS Veces, capitulo FROM colores
  2. GROUP BY persona, color
  3. ORDER BY persona, MAX(veces_utilizado) DESC

Éste me entrega ordenado el nombre de la persona, el color y las veces que lo utilizó

El objetivo de éste SELECT es hacer un update a otra tabla que matchea los nombres, y requiero me entregue el o los colores más usados en caso de haber valores repetidos.

¿Es posible que me puedan ayuda?

Saludos

Última edición por gnzsoloyo; 04/07/2014 a las 07:55
  #2 (permalink)  
Antiguo 03/07/2014, 13:57
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: Valores más usados en una consulta

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. nombre VARCHAR(20),
  4. color VARCHAR(10),
  5. numero INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES ('Raul','Negro',3)
  9. INSERT INTO #temp VALUES ('Alberto','Verde',4)
  10. INSERT INTO #temp VALUES ('Carlos','Rojo',5)
  11. INSERT INTO #temp VALUES ('Carlos','Amarillo',2)
  12. INSERT INTO #temp VALUES ('Alberto','Gris',3)
  13. INSERT INTO #temp VALUES ('Isabel','Azul',4)
  14. INSERT INTO #temp VALUES ('Manuel','Rojo',5)
  15. INSERT INTO #temp VALUES ('Carlos','Negro',1)
  16. INSERT INTO #temp VALUES ('Raul','Azul',6)
  17.  
  18. SELECT t1.* FROM #temp AS t1
  19. LEFT JOIN (SELECT nombre,MAX(numero) numero FROM #temp  GROUP BY nombre) AS t2 ON (t1.nombre=t2.nombre AND t1.numero=t2.numero)
  20. WHERE t2.nombre IS NOT NULL

nombre color numero
-------------------- ---------- -----------
Raul Azul 6
Manuel Rojo 5
Isabel Azul 4
Carlos Rojo 5
Alberto Verde 4


saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/07/2014, 14:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Valores más usados en una consulta

Con CTE

Código SQL:
Ver original
  1. DECLARE  @Colores TABLE (Persona VARCHAR(50), Color VARCHAR(50), veces_utilizado INT)
  2.  
  3. INSERT INTO @Colores VALUES('Raul', 'Negro', 3)
  4.  INSERT INTO @Colores VALUES('Alberto', 'Verde', 4)
  5.  INSERT INTO @Colores VALUES('Carlos', 'Rojo', 5)
  6.  INSERT INTO @Colores VALUES('Carlos', 'Amarillo', 2)
  7.  INSERT INTO @Colores VALUES('Alberto', 'Gris', 3)
  8.  INSERT INTO @Colores VALUES('Isabel', 'Azul', 4)
  9.  INSERT INTO @Colores VALUES('Manuel', 'Rojo', 5)
  10.  INSERT INTO @Colores VALUES('Carlos', 'Negro', 1)
  11.  INSERT INTO @Colores VALUES('Raul', 'Azul', 6)
  12.  
  13.  
  14. SELECT *
  15. FROM (
  16.        SELECT *,
  17.               ROW_NUMBER() OVER(partition BY Persona ORDER BY veces_utilizado DESC) AS rn
  18.        FROM @Colores
  19.      ) AS T
  20. WHERE rn = 1
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 03/07/2014, 18:27
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Hola,

muchas gracias por la aportación y la pronta respuesta, sin embargo quisiera saber si dentro de éste query puedo sustituir la parte de INSERT INTO #temp VALUES por
Código SQL:
Ver original
  1. INSERT INTO #temp (nombre,color,numero)
  2.     SELECT nombre, color, COUNT(color) AS numero FROM colores

O como puedo insertar los valores de una tabla con más registros, ya que mi tabla contiene más de 2000 registros.

Quedo atento y muchas gracias!

Saludos.

Última edición por gnzsoloyo; 04/07/2014 a las 07:54
  #5 (permalink)  
Antiguo 03/07/2014, 18:49
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Con datos reales, ocupé éste query

Código SQL:
Ver original
  1. CREATE TABLE #temp1
  2.     (
  3.     rfc VARCHAR(20),
  4.     capitulo VARCHAR(10),
  5.     numero INT
  6.     )
  7.      
  8.     INSERT INTO #temp1(rfc, capitulo, numero)
  9.     SELECT RFC, CAPITULO, CAPITULO_UT
  10.     FROM CAPITULOS
  11.     ORDER BY RFC, CAPITULO, CAPITULO_UT    
  12.    
  13.     SELECT t1.* FROM #temp1 AS t1
  14.     LEFT JOIN (SELECT rfc,MAX(numero) numero FROM #temp1  GROUP BY rfc) AS t2 ON (t1.rfc=t2.rfc AND t1.numero=t2.numero)
  15.     WHERE t2.rfc IS NOT NULL

Sin embargo estoy recibiendo el siguiente error:

Mens. 8152, Nivel 16, Estado 14, Línea 1
Los datos de cadena o binarios se truncarían.
Se terminó la instrucción.

Saludos.

Última edición por gnzsoloyo; 04/07/2014 a las 07:54
  #6 (permalink)  
Antiguo 04/07/2014, 07:16
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: Valores más usados en una consulta

ese error lo recibes porque tienes valores mas grandes que los que pones en tu tabla temporal, ahora porque use una tabla temporal?? porque no tengo tus datos y no tengo la estructura de tus tablas, para que entendieras lo que tienes que hacer use una tabla temporal, tu lo que tienes que hacer(si aplicamos un poquito la logica) es sustituir los nombres de tablas y columnas que yo uso por los que tienes tu, ahora usando la convencion de nombres de tus tablas tu query quedaria:

Código SQL:
Ver original
  1. SELECT t1.* FROM capitulos AS t1
  2. LEFT JOIN (SELECT rfc,MAX(capitulo_ut) numero FROM capitulos  GROUP BY rfc) AS t2 ON (t1.rfc=t2.rfc AND t1.capitulo_ut=t2.capitulo_ut)
  3. WHERE t2.nombre IS NOT NULL

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 04/07/2014, 09:45
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Hola,

Ya pude ejecutar el query, sin embargo sigue entregando el mismo resultado.

Lo hice de ésta manera

SELECT t1.* FROM capitulos AS t1
LEFT JOIN (SELECT rfc,MAX(CAPITULO_UT)as numero FROM capitulos GROUP BY rfc, CAPITULO_UT) AS t2 ON (t1.rfc=t2.rfc AND t1.capitulo_ut=t2.numero)
WHERE t2.numero IS NOT NULL
order by RFC

Pero obtuve el mismo resultado:

RFC CAPITULO CAPITULO_UT
AAM130221UF9 68 1
AAM130221UF9 73 1
AAM130221UF9 85 1
AAM130221UF9 90 1
AAM130221UF9 84 2
AGM131011KU9 76 1
AGR071016DX9 60 5
AGR071016DX9 48 7
AII110223233 76 1
AME941028N57 75 1
AME941028N57 38 1
AME941028N57 81 2
AME941028N57 28 3

Para el caso de AAM130221UF9, únicamente debería de aparecer éste registro:

AAM130221UF9 84 2

Agradezco de antemano la dedicación y la pronta respuesta.


Saludos.
  #8 (permalink)  
Antiguo 04/07/2014, 09:50
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: Valores más usados en una consulta

Cita:
Iniciado por __lzUL4zZ__ Ver Mensaje
Hola,


SELECT t1.* FROM capitulos AS t1
LEFT JOIN (SELECT rfc,MAX(CAPITULO_UT)as numero FROM capitulos GROUP BY rfc, CAPITULO_UT) AS t2 ON (t1.rfc=t2.rfc AND t1.capitulo_ut=t2.numero)
WHERE t2.numero IS NOT NULL
order by RFC
Porque agrupas por rfc, CAPITULO_UT?? yo no use eso en el query que te mande,quita el capitulo_ut de ese query y te llevaras una sorpresa ;)

Código SQL:
Ver original
  1. SELECT t1.* FROM capitulos AS t1
  2.     LEFT JOIN (SELECT rfc,MAX(CAPITULO_UT)AS numero FROM capitulos  GROUP BY rfc) AS t2 ON (t1.rfc=t2.rfc AND t1.capitulo_ut=t2.numero)
  3.     WHERE t2.numero IS NOT NULL
  4.     ORDER BY RFC

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 04/07/2014, 09:53
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Aaahhhhhhh!!!!
Perdon!!
Si me llevé una gran sorpresa!

Muchas muchas gracias!

como los puedo recomendar?

es excelente el aporte que hacen, cuando yo tenga algo también aportaré.

Muchas Gracias Libras!

Saludos
  #10 (permalink)  
Antiguo 04/07/2014, 09:57
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: Valores más usados en una consulta

Cita:
Iniciado por __lzUL4zZ__ Ver Mensaje
Aaahhhhhhh!!!!
Perdon!!
Si me llevé una gran sorpresa!

Muchas muchas gracias!

como los puedo recomendar?

es excelente el aporte que hacen, cuando yo tenga algo también aportaré.

Muchas Gracias Libras!

Saludos
Preferiria las recomendaciones en especie ;) (se aceptan cervezas, vales de despensa, efectivo, transferencias pay pal etc etc, aunque en este foro varios usuarios me han prometido cosas que nunca han llegado pero bueno)

Un placer el poder ayudarte :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 04/07/2014, 10:08
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Jajajaja! pues yo siempre quiero cervezas, si eres del DF, y estás cerca del Centro ya la hicimos. No prometo nada, pero si podemos agendar unas cervezas por supuesto.
  #12 (permalink)  
Antiguo 04/07/2014, 10:24
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: Valores más usados en una consulta

No pos ya estuvo, en este momento estoy en GDL asi que lo veo dificil ;) pero cuando andes por estas tierras quizas podamos agendar esas cervezas jejejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 04/07/2014, 11:57
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Aprovechando la buena disposición que han tenido en el foro para la respuesta a las consultas, me nace otra la cual me está causando dolores de cabeza, no sé si ya se había comentado anteriormente, pero estoy haciendo un UPDATE a un campo de otra tabla con el resultado del query que me apoyaron a corregir.

Se creó una tabla con el query anterior mencionado y se hace el UPDATE de la siguiente manera
Código SQL:
Ver original
  1. UPDATE IMMEX_NUEVAS
  2.         SET CAP_PRIN_IMP_TEMP = (SELECT [MAX_CAPITULOS].CAPITULO FROM [MAX_CAPITULOS]
  3.         WHERE [MAX_CAPITULOS].RFC IN (IMMEX_NUEVAS.RFC))

Sin embargo me envía el siguiente error

Mens. 512, Nivel 16, Estado 1, Línea 1
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
Se terminó la instrucción.

Tengo entendido que para MySQL 2005 existe una función llamada GROUP_CONCAT pero por lo que veo en SQL2008 Server ya no está disponible, hay alguna función que homologue ésta función? o en su defecto como podría hacer para que los resultados obtenidos por la consulta me los dé concatenados y separados por comas.

Perdón por la molestia.

Saludos.

Última edición por gnzsoloyo; 23/07/2014 a las 11:29
  #14 (permalink)  
Antiguo 04/07/2014, 12:59
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Valores más usados en una consulta

Yo podría apuntarme en representación del buen LIBRAS.

Libras, déjame, yo me sacrifico por ti
__________________
MCTS Isaias Islas
  #15 (permalink)  
Antiguo 04/07/2014, 13:10
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: Valores más usados en una consulta

Cita:
Iniciado por iislas Ver Mensaje
Yo podría apuntarme en representación del buen LIBRAS.

Libras, déjame, yo me sacrifico por ti
Sacrifiquese amigo ;) jejejejeje, sobre la pregunta del update, asi no se hace un update de multiples valores mi estimado tendrias que hacer algo como esto:


Código SQL:
Ver original
  1. UPDATE IMMEX_NUEVAS
  2. SET CAP_PRIN_IMP_TEMP = t1.campo
  3. FROM
  4. (SELECT [MAX_CAPITULOS].CAPITULO AS campo, capitulo FROM [MAX_CAPITULOS]
  5. WHERE [MAX_CAPITULOS].RFC IN (IMMEX_NUEVAS.RFC))
  6. AS t1 WHERE IMMEX_NUEVAS.capitulo=t1.capitulo

trata de investigar mas por tu cuenta ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 04/07/2014, 17:23
 
Fecha de Ingreso: julio-2014
Ubicación: Tlalnepantla
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Valores más usados en una consulta

Estimados Libras, iislas,

Siguiendo la recomendación de Libras, me encontré con el siguiente query, el cual da a la perfección lo que estaba buscando.

Lo comparto con el foro, y con ustedes esperando sea de utilidad para futuras consultas o dudas.

Código SQL:
Ver original
  1. WITH Virtual ( rfc, rnk, capitulo )
  2.              AS ( SELECT rfc,
  3.                          ROW_NUMBER() OVER( PARTITION BY rfc ORDER BY rfc ),
  4.                          CAST( capitulo AS VARCHAR(8000) )
  5.                     FROM idapitulos),
  6.    AnchorVirtual ( rfc, rnk, capitulo )
  7.              AS ( SELECT rfc, rnk, capitulo
  8.                     FROM Virtual
  9.                    WHERE rnk = 1 ),
  10. RecurVirtual ( rfc, rnk, capitulo )
  11.              AS ( SELECT rfc, rnk, capitulo
  12.                     FROM AnchorVirtual
  13.                    UNION ALL
  14.                   SELECT Virtual.rfc, Virtual.rnk,
  15.                          RecurVirtual.capitulo + ', ' + Virtual.capitulo
  16.                     FROM Virtual
  17.                    INNER JOIN RecurVirtual
  18.                       ON Virtual.rfc = RecurVirtual.rfc
  19.                      AND Virtual.rnk = RecurVirtual.rnk + 1 )
  20. SELECT rfc, MAX( capitulo ) AS Conc_capitulo
  21. INTO CONC_CAPITULOS
  22.       FROM RecurVirtual
  23.   GROUP BY rfc;
Que tengan un excelente fin de semana.

Saludos

Última edición por gnzsoloyo; 23/07/2014 a las 11:29
  #17 (permalink)  
Antiguo 04/07/2014, 17:25
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Valores más usados en una consulta

chelas, chelas, chelas, chelas...
__________________
MCTS Isaias Islas

Etiquetas: nombre, select, siguiente, 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 07:14.