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

Agrupamiento de campos

Estas en el tema de Agrupamiento de campos en el foro de SQL Server en Foros del Web. Estimados, Tengo la siguiente tabla que muestra ID de sucursal, ID de producto y la cantidad vendida por producto y sucursal: SUCURSAL PRODUCTO CANTIDAD VENDIDA ...
  #1 (permalink)  
Antiguo 10/06/2011, 07:20
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 12 años, 10 meses
Puntos: 0
Agrupamiento de campos

Estimados,
Tengo la siguiente tabla que muestra ID de sucursal, ID de producto y la cantidad vendida por producto y sucursal:

SUCURSAL PRODUCTO CANTIDAD VENDIDA
1 a 15
1 b 22
1 c 5
2 a 12
2 b 51


Lo que necesito es por cada sucursal obtener el producto que más se vendió ( he probado con hacer max(cantidad vendida) y agrupando por ambos campos pero no logrué hacerlo.. El resultado debería ser:


SUCURSAL PRODUCTO CANTIDAD VENDIDA
1 b 22
2 b 51

Como puedo obtenerlo??

Gracias
  #2 (permalink)  
Antiguo 10/06/2011, 08:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Agrupamiento de campos

Hola Leocap:

Veo que este fue el primer post que publicas, así es que vale hacer algunas recomendaciones antes de proceder a ayudarte.

Primero, antes de publicar algún post utiliza la HERRAMIENTA DE BÚSQUEDA del foro, o pregunta a SAN GOOGLE, es muy probable que alguien más ya haya tratado el tema, por lo que no abría necesidad de publicar un nuevo tema.

Segundo, si después de buscar por tu cuenta sigues sin encontrar una solución y decides publicar un tema nuevo PON ALGO DEL CÓDIGO QUE HAZ INTENTADO DESARROLLAR. En tu post dices que lo intentaste hacer con MAX(cantidad_vendida) lo cual es correcto, por lo tanto si hubieras puesto el código que intentaste hacer sólo faltaría afinar la sentencia.

A ahora sí entrando en materia, este tipo de consultas se ha tratado muchas veces en este foro y hay muchas formas de obtener lo que quieres, esta sería una de esas formas:

Código SQL:
Ver original
  1. DECLARE @tabla TABLE (sucursal INT, producto VARCHAR, cantidad_vendida INT)
  2. INSERT INTO @tabla VALUES (1, 'a', 15)
  3. INSERT INTO @tabla VALUES (1, 'b', 22)
  4. INSERT INTO @tabla VALUES (1, 'c', 5)
  5. INSERT INTO @tabla VALUES (2, 'a', 12)
  6. INSERT INTO @tabla VALUES (2, 'b', 51)
  7.  
  8. SELECT T1.* FROM @Tabla T1 INNER JOIN
  9. (SELECT sucursal, MAX(cantidad_vendida) max_cantidad_vendida FROM @tabla GROUP BY sucursal) T2 ON
  10. T1.sucursal = T2.sucursal AND
  11. T1.cantidad_vendida = T2.max_cantidad_vendida
  12. ORDER BY T1.sucursal

Si observas se hace una subconsulta con sucursal y max(cantidad_vendida), agrupando por sucursal para obtener esto:

Código:
sucursal    max_cantidad_vendida
----------- --------------------
1           22
2           51
Con este resultado se hace un INNER JOIN sobre tu tabla de datos y listo.

Te repito que hay varias formas de obtener este resultado, dale un vistazo y si necesita ayuda lo comentas en el foro.

Saludos.
Leo.
  #3 (permalink)  
Antiguo 13/06/2011, 14:26
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Agrupamiento de campos

leonardo_josue,
Muchas gracias por tu respuesta, me ha sido de utilidad dado que no había encontrado la respuesta en ningún foro. Una consulta más, si por ejemplo tengo en la categoría 1 el producto C que se vendió 22 veces, es decir que hay 2 máximos para la sucursal 1:

SUCURSAL PRODUCTO CANTIDAD VENDIDA
1 a 15
1 b 22
1 c 22
1 c 5
2 a 12
2 b 51

Hay alguna forma de traer solamente uno de los 2 productos máximos (b o c) para la sucursal 1??, es decir devolver un solo máximo por categoría sin importar cual producto de los máximos sea..

Muchas gracias!
  #4 (permalink)  
Antiguo 13/06/2011, 14:36
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: Agrupamiento de campos

Si quieres regresar nada mas un registro prueba con select top 1 registro from tabla

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 13/06/2011, 20:28
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Agrupamiento de campos

Necesito regresar un registro (el máximo) por cada sucursal.. por lo que estuve probando el top 1 no me sirve ya que solo me trae el primer registro
  #6 (permalink)  
Antiguo 14/06/2011, 08:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Agrupamiento de campos

Hola leocap:

Se me ocurre que utilices ROW_NUMBER() para numerar cuantos máximos tienes y filtrar siempre el máximo #1, es decir, algo como esto:

Código SQL:
Ver original
  1. DECLARE @tabla TABLE (sucursal INT, producto VARCHAR, cantidad_vendida INT)
  2. INSERT INTO @tabla VALUES (1, 'a', 15)
  3. INSERT INTO @tabla VALUES (1, 'b', 22)
  4. INSERT INTO @tabla VALUES (1, 'c', 22)
  5. INSERT INTO @tabla VALUES (1, 'd', 22)
  6. INSERT INTO @tabla VALUES (1, 'c', 5)
  7. INSERT INTO @tabla VALUES (2, 'a', 12)
  8. INSERT INTO @tabla VALUES (2, 'b', 51)
  9. INSERT INTO @tabla VALUES (2, 'c', 51)
  10. INSERT INTO @tabla VALUES (2, 'd', 51)
  11. SELECT T1.sucursal, T1.producto, T1.cantidad_vendida,
  12. ROW_NUMBER() OVER(PARTITION BY T1.sucursal ORDER BY T1.sucursal, T1.cantidad_vendida) rownumber
  13. FROM @Tabla T1 INNER JOIN
  14. (SELECT sucursal, MAX(cantidad_vendida) max_cantidad_vendida FROM @tabla GROUP BY sucursal) T2 ON
  15. T1.sucursal = T2.sucursal AND
  16. T1.cantidad_vendida = T2.max_cantidad_vendida
  17. ORDER BY T1.sucursal

Si observas agregué varios máximos más para cada sucursal, por lo que la consulta te daría algo como esto:

Código:
sucursal    producto cantidad_vendida rownumber
----------- -------- ---------------- --------------------
1           b        22               1
1           c        22               2
1           d        22               3
2           b        51               1
2           c        51               2
2           d        51               3
Finalmente podrías hacer un nuevo select sobre este resultado para recuperar solo los registros con rownumber = 1, es decir algo como esto:

Código SQL:
Ver original
  1. SELECT TF.sucursal, TF.producto, TF.cantidad_vendida FROM
  2. (
  3. SELECT T1.sucursal, T1.producto, T1.cantidad_vendida,
  4. ROW_NUMBER() OVER(PARTITION BY T1.sucursal ORDER BY T1.sucursal, T1.cantidad_vendida) rownumber
  5. FROM @Tabla T1 INNER JOIN
  6. (SELECT sucursal, MAX(cantidad_vendida) max_cantidad_vendida FROM @tabla GROUP BY sucursal) T2 ON
  7. T1.sucursal = T2.sucursal AND
  8. T1.cantidad_vendida = T2.max_cantidad_vendida
  9. )TF
  10. WHERE rownumber = 1
  11. ORDER BY TF.sucursal

Esta consulta te regresaría lo siguiente:

Código:
sucursal    producto cantidad_vendida
----------- -------- ----------------
1           b        22
2           b        51
si encuentro alguna otra forma más sencilla de obtener este resultado la publico en en transcurso del día, por lo pronto prueba la consulta a ver si te sirve.

Saludos
Leo.
  #7 (permalink)  
Antiguo 14/06/2011, 08:47
Avatar de -rommel_  
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 360
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Agrupamiento de campos

excelente... es una muy buena idea... yo podria apoyarte con una consulta... pero este es el verdadero procedimiento de como tu logica deberia seguir... siempre haciendo un procedimiento de escritorio ayuda bastante :D

Saludos, seguro que te sirve...
__________________
Odio verte ir, pero me encanta verte yendo :)

Etiquetas: campos
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 15:15.