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

[SOLUCIONADO] Agrupar resultados de una consulta

Estas en el tema de Agrupar resultados de una consulta en el foro de SQL Server en Foros del Web. Buenas tardes, una sola pregunta, por ejemplo en mi base de datos tengo varias marcas en total 100 marcas y cada marca tiene en promedio ...
  #1 (permalink)  
Antiguo 06/05/2014, 15:17
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Agrupar resultados de una consulta

Buenas tardes,
una sola pregunta, por ejemplo en mi base de datos tengo varias marcas en total 100 marcas y cada marca tiene en promedio 20 productos, quisiera saber si puedo llamar en una sola consulta los ultimos 5 productos que se vendieron de cada marca para que me muestre algo asi

MARCA-------------PRODUCTO-------------------Fecha de venta

Fraco----------------L6-820013-------------------2014/04/20
Fraco----------------L5-054088-------------------201404/20
Fraco----------------L5-054210-------------------2014/04/25
Fraco----------------L14-90182165--------------2014/04/30
Fraco----------------L5-055364-------------------2014/04/29
Dayco----------------L10-100505-----------------
Dayco----------------L15-152001-----------------
Dayco----------------L5-055312-------------------
Dayco----------------L12-122058-----------------
Dayco----------------L6-EM119-------------------
Navcar----------------L15-150052----------------
Navcar----------------L5-050156------------------
Navcar----------------L2-RC0050-----------------
Navcar----------------L5-053049v----------------
Navcar----------------L5-051610------------------
Mahle----------------L5-054037-------------------
Mahle----------------L11-113066-----------------
Mahle----------------L7-9302415-----------------
Mahle----------------L6-316153-------------------
Mahle----------------L10-100038-----------------

espero me hayan entendido, y me puedan explicar que consulta usar algo asi como que me agrupe de a 5 marcas.


uso sql server 2008

Mil gracias
  #2 (permalink)  
Antiguo 06/05/2014, 15:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

si se puede, investiga sobre la funcion row_number con partition y podras obtener el resultado que quieres :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 06/05/2014, 16:51
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

hola mira con este query consulto todas las ventas de todos los items, ahora lo que quiero es que solo me muestre las ultimas 5 ventas de cada item

Código SQL:
Ver original
  1. SELECT V.ItemCode, B.ItmsGrpCod, V.DocDate
  2. FROM INV1 V
  3. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  4. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod
  5. ORDER BY ItemCode, DocDate
este query me muestra datos asi:

ItemCode/ ItmsGrpCod/DocDate
L1-001 NOVEX /115/2014-02-22 00:00:00.000
L1-001 NOVEX /115/2014-02-25 00:00:00.000
L1-001 NOVEX /115//2014-02-27 00:00:00.000
L1-001 NOVEX /115/2014-03-04 00:00:00.000
L1-001 NOVEX /115/2014-03-06 00:00:00.000
L1-001 NOVEX /115/2014-03-07 00:00:00.000
L1-001 NOVEX /115/2014-03-07 00:00:00.000
L1-001 NOVEX /115/2014-03-13 00:00:00.000
L1-001 NOVEX /115/2014-03-15 00:00:00.000
L1-001 VARGA /300/2010-11-25 00:00:00.000
L1-001 VARGA /300/2011-06-22 00:00:00.000
L1-001 VARGA /300/2011-07-13 00:00:00.000
L1-001 VARGA /300/2012-03-22 00:00:00.000
L1-001 VARGA /300/2012-03-23 00:00:00.000
L1-009166 /124 /2010-11-16 00:00:00.000
L1-009166 /124 /2011-01-04 00:00:00.000
L1-009166 /124 /2011-04-30 00:00:00.000
L1-009166 /124 /2011-06-08 00:00:00.000
L1-009166 //124 /2013-04-22 00:00:00.000
L1-009166 /124 /2013-09-02 00:00:00.000
L1-009166 /124 /2013-09-17 00:00:00.000
L1-009166 /124 /2013-12-07 00:00:00.000

y pues de hay para abajo muchos mal como debo modificar la consulta para que solo me muestre las ultimas 5 fechas de venta de cada item itente hacerlo con el row number con est consulta:

Código SQL:
Ver original
  1. SELECT
  2. ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod ORDER BY V.ItemCode) [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
  3. FROM INV1 V
  4. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  5. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod
pero no se donde la condiciono para que solo me muestre 5

gracias por sus respuestas

Última edición por gnzsoloyo; 07/05/2014 a las 16:49
  #4 (permalink)  
Antiguo 06/05/2014, 16:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

Código SQL:
Ver original
  1. SELECT * FROM(
  2. SELECT
  3. ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod ORDER BY V.ItemCode) [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
  4. FROM INV1 V
  5. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  6. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod
  7. ) t1 WHERE Nro<=5

con algo como eso :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 07/05/2014, 15:58
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

Hola libras que pena volver a molestar, lo que pasa es que la consulta no me esta arrojando lo que necesito mira, con la consulta sin poner el where:
Código SQL:
Ver original
  1. SELECT
  2. ROW_NUMBER() OVER(PARTITION BY V.ItemCode ORDER BY V.DocDate DESC) AS [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
  3. FROM INV1 V
  4. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  5. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod

lo agrupe por fecha para que me arroje de la mas reciente a las mas antigua y ps bien me arroja los items con fecha y cada iten enumerado por el row_number asi:

Nro ItemCode ItmsGrpCod DocDate
1 L1-001 EXTRA 115 2014-03-12 00:00:00.000
2 L1-001 EXTRA 115 2014-03-11 00:00:00.000
3 L1-001 EXTRA 115 2014-03-07 00:00:00.000
4 L1-001 EXTRA 115 2014-03-07 00:00:00.000
5 L1-001 EXTRA 115 2014-03-07 00:00:00.000
6 L1-001 EXTRA 115 2014-03-06 00:00:00.000
7 L1-001 EXTRA 115 2014-02-21 00:00:00.000
8 L1-001 EXTRA 115 2014-02-19 00:00:00.000
9 L1-001 EXTRA 115 2014-02-11 00:00:00.000
10 L1-001 EXTRA 115 2014-02-05 00:00:00.000
11 L1-001 EXTRA 115 2014-02-03 00:00:00.000
12 L1-001 EXTRA 115 2014-02-01 00:00:00.000
13 L1-001 EXTRA 115 2014-01-28 00:00:00.000
14 L1-001 EXTRA 115 2014-01-23 00:00:00.000
15 L1-001 EXTRA 115 2014-01-21 00:00:00.000
16 L1-001 EXTRA 115 2014-01-18 00:00:00.000
17 L1-001 EXTRA 115 2014-01-02 00:00:00.000
18 L1-001 EXTRA 115 2013-12-30 00:00:00.000
19 L1-001 EXTRA 115 2013-12-28 00:00:00.000
20 L1-001 EXTRA 115 2013-12-18 00:00:00.000
1 L1-001 NOVEX 115 2014-03-15 00:00:00.000
2 L1-001 NOVEX 115 2014-03-13 00:00:00.000
3 L1-001 NOVEX 115 2014-03-07 00:00:00.000
4 L1-001 NOVEX 115 2014-03-07 00:00:00.000
5 L1-001 NOVEX 115 2014-03-06 00:00:00.000
6 L1-001 NOVEX 115 2014-03-04 00:00:00.000
7 L1-001 NOVEX 115 2014-02-27 00:00:00.000
8 L1-001 NOVEX 115 2014-02-25 00:00:00.000
9 L1-001 NOVEX 115 2014-02-22 00:00:00.000
10 L1-001 NOVEX 115 2014-02-22 00:00:00.000
11 L1-001 NOVEX 115 2014-02-19 00:00:00.000

bueno se supone que si lo condicionaba como me dijiste iba a obtener solo los 5 primeros pero no es asi hize la siguiente consulta :
Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3. (
  4. SELECT
  5. ROW_NUMBER() OVER(PARTITION BY V.ItemCode ORDER BY V.DocDate DESC) AS [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
  6. FROM INV1 V
  7. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  8. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod) t1
  9. WHERE nro <=5

pero en vez de arrojarme por ejemplo los primeros 5 items de la consulta anterior me arroja esto:

Nro ItemCode ItmsGrpCod DocDate
1 L1-001 EXTRA 115 2014-03-12 00:00:00.000
3 L1-001 EXTRA 115 2014-03-07 00:00:00.000
5 L1-001 EXTRA 115 2014-03-07 00:00:00.000
1 L1-001 NOVEX 115 2014-03-15 00:00:00.000
3 L1-001 NOVEX 115 2014-03-07 00:00:00.000
5 L1-001 NOVEX 115 2014-03-06 00:00:00.000
2 L1-001 VARGA 300 2012-03-22 00:00:00.000
4 L1-001 VARGA 300 2011-06-22 00:00:00.000
1 L1-009166 124 2013-12-07 00:00:00.000
3 L1-009166 124 2013-09-02 00:00:00.000
5 L1-009166 124 2011-06-08 00:00:00.000
1 L10-100001 131 2014-03-19 00:00:00.000
3 L10-100001 131 2014-03-15 00:00:00.000
5 L10-100001 131 2014-03-13 00:00:00.000
1 L10-100002 131 2014-03-12 00:00:00.000
3 L10-100002 131 2014-03-11 00:00:00.000
5 L10-100002 131 2014-02-20 00:00:00.000
1 L10-100003 131 2014-03-19 00:00:00.000
3 L10-100003 131 2014-03-14 00:00:00.000
5 L10-100003 131 2014-03-14 00:00:00.000
1 L10-100004 131 2014-03-12 00:00:00.000
3 L10-100004 131 2014-02-12 00:00:00.000
5 L10-100004 131 2014-02-11 00:00:00.000

si se fijan en la primera consulta el item L1-001 EXTRA tenia muchas ventas casi 20 entonces no se por que solo me arroja 3 de otros solo me arroja 2 o 1 por ejemplo en la primera consulta de este item L10-101821 me arroja estos dos:

Nro ItemCode ItmsGrpCod DocDate
1 L10-101821 155 2011-03-17 00:00:00.000
2 L10-101821 155 2011-03-17 00:00:00.000

pero en la segunda consulta solo me arroja 1 asi :

Nro ItemCode ItmsGrpCod DocDate
2 L10-101820 240 2013-08-30 00:00:00.000
4 L10-101820 240 2013-06-11 00:00:00.000
2 L10-101821 155 2011-03-17 00:00:00.000
2 L10-101822 155 2014-02-27 00:00:00.000

a que se debe esto y como podría solucionarlo, mil gracias por la ayuda

Última edición por gnzsoloyo; 07/05/2014 a las 16:49
  #6 (permalink)  
Antiguo 07/05/2014, 22:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

para tu ejemplo creo que seria mejor que usaras NTile en lugar de row_number, investiga sobre la funcion NTILE

http://msdn.microsoft.com/es-es/library/ms175126.aspx
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 08/05/2014, 07:22
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

OK voy a investigar y te cuento.

gracias
  #8 (permalink)  
Antiguo 08/05/2014, 08:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

podria quedar con esto tomando en cuenta los datos que muestras :P

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. Nro INT,
  4. ItemCode    VARCHAR(20),
  5. ItmsGrpCod  INT,
  6. DocDate datetime
  7. )
  8.  
  9. INSERT INTO #temp VALUES (1,'L1-001 EXTRA',115,'2014-03-12 00:00:00.000')
  10. INSERT INTO #temp VALUES (2,'L1-001 EXTRA',115,'2014-03-11 00:00:00.000')
  11. INSERT INTO #temp VALUES (3,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
  12. INSERT INTO #temp VALUES (4,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
  13. INSERT INTO #temp VALUES (5,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
  14. INSERT INTO #temp VALUES (6,'L1-001 EXTRA',115,'2014-03-06 00:00:00.000')
  15. INSERT INTO #temp VALUES (7,'L1-001 EXTRA',115,'2014-02-21 00:00:00.000')
  16. INSERT INTO #temp VALUES (8,'L1-001 EXTRA',115,'2014-02-19 00:00:00.000')
  17. INSERT INTO #temp VALUES (9,'L1-001 EXTRA',115,'2014-02-11 00:00:00.000')
  18. INSERT INTO #temp VALUES (10,'L1-001 EXTRA',115,'2014-02-05 00:00:00.000')
  19. INSERT INTO #temp VALUES (11,'L1-001 EXTRA',115,'2014-02-03 00:00:00.000')
  20. INSERT INTO #temp VALUES (12,'L1-001 EXTRA',115,'2014-02-01 00:00:00.000')
  21. INSERT INTO #temp VALUES (13,'L1-001 EXTRA',115,'2014-01-28 00:00:00.000')
  22. INSERT INTO #temp VALUES (14,'L1-001 EXTRA',115,'2014-01-23 00:00:00.000')
  23. INSERT INTO #temp VALUES (15,'L1-001 EXTRA',115,'2014-01-21 00:00:00.000')
  24. INSERT INTO #temp VALUES (16,'L1-001 EXTRA',115,'2014-01-18 00:00:00.000')
  25. INSERT INTO #temp VALUES (17,'L1-001 EXTRA',115,'2014-01-02 00:00:00.000')
  26. INSERT INTO #temp VALUES (18,'L1-001 EXTRA',115,'2013-12-30 00:00:00.000')
  27. INSERT INTO #temp VALUES (19,'L1-001 EXTRA',115,'2013-12-28 00:00:00.000')
  28. INSERT INTO #temp VALUES (20,'L1-001 EXTRA',115,'2013-12-18 00:00:00.000')
  29. INSERT INTO #temp VALUES (1,'L1-001 NOVEX',115,'2014-03-15 00:00:00.000')
  30. INSERT INTO #temp VALUES (2,'L1-001 NOVEX',115,'2014-03-13 00:00:00.000')
  31. INSERT INTO #temp VALUES (3,'L1-001 NOVEX',115,'2014-03-07 00:00:00.000')
  32. INSERT INTO #temp VALUES (4,'L1-001 NOVEX',115,'2014-03-07 00:00:00.000')
  33. INSERT INTO #temp VALUES (5,'L1-001 NOVEX',115,'2014-03-06 00:00:00.000')
  34. INSERT INTO #temp VALUES (6,'L1-001 NOVEX',115,'2014-03-04 00:00:00.000')
  35. INSERT INTO #temp VALUES (7,'L1-001 NOVEX',115,'2014-02-27 00:00:00.000')
  36. INSERT INTO #temp VALUES (8,'L1-001 NOVEX',115,'2014-02-25 00:00:00.000')
  37. INSERT INTO #temp VALUES (9,'L1-001 NOVEX',115,'2014-02-22 00:00:00.000')
  38. INSERT INTO #temp VALUES (10,'L1-001 NOVEX',115,'2014-02-22 00:00:00.000')
  39. INSERT INTO #temp VALUES (11,'L1-001 NOVEX',115,'2014-02-19 00:00:00.000')
  40.  
  41. SELECT * FROM #temp WHERE Nro BETWEEN 1 AND 5

creo que la falla fue el where final en lugar de WHERE nro <=5

pruebalo con:

Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3. (
  4. SELECT
  5. ROW_NUMBER() OVER(PARTITION BY V.ItemCode ORDER BY V.DocDate DESC) AS [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
  6. FROM INV1 V
  7. INNER JOIN OITM M ON V.ItemCode=M.ItemCode
  8. INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod) t1
  9. WHERE nro BETWEEN 1 AND 5

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 08/05/2014, 09:30
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

Libras gracias por las respuestas pero no se que pasa he probado de todo he leido todo y nada que puedo sacar la consulta como la necesito, el NTILE no funciono lo unico que hizo fue dividir mi N numero de resultados y dividirlo en el valor que yo indicaba en el NLITE ayer habia probado la opcion del between pero me devuelve exactamente lo que me devuelve si pongo el
where nro <=5 tambien intente con esto

where nro in (1,2,3,4,5) y con esto
where nro in ('1','2','3','4','5') pero nada

me muestra lo mismo que me muestra con el where nro <=5 por favor libras yo se que llebamos dandole vueltas a este tema mucho pero en verdad necesito ayuda.

mil gracias
  #10 (permalink)  
Antiguo 08/05/2014, 09:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

tienes skype? el mio es librasgan si gustas agregarme, otra cosa, probaste el query que te presente con los datos temporales??? con esos datos si funciona pero no se como esten todos tus datos......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 08/05/2014, 09:56
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

no tengo skype.
Y si es raro por que parece facil decir que como ya las tengo enumeradas solo seria llamar los nro que estén entre 1 y 5 pero no me saca datos que no son, podrías darme tu mail para enviarte los pantallazos de como me arroja la consulta
  #12 (permalink)  
Antiguo 08/05/2014, 09:58
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

tienes msn, mi email es [email protected].....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 08/05/2014, 10:12
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

libras ya reocrde mi cuenta de skype te envie la invitacion.
soy lender9106
  #14 (permalink)  
Antiguo 08/05/2014, 10:52
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

Libras despues de pensar y pensar la unica forma que encontre para solucionarlo fue esta:

select *
from
(
SELECT
ROW_NUMBER() OVER(PARTITION BY V.ItemCode ORDER BY V.DocDate DESC) AS [Nro], V.ItemCode, B.ItmsGrpCod, V.DocDate
FROM INV1 V
INNER JOIN OITM M ON V.ItemCode=M.ItemCode
INNER JOIN OITB B ON M.ItmsGrpCod=B.ItmsGrpCod
)t1
where t1.Nro like '1' or t1.Nro like '2' or t1.Nro like '3' or t1.Nro like '4'or t1.Nro like '5'
order by ItemCode, DocDate desc
  #15 (permalink)  
Antiguo 08/05/2014, 11:11
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 16 años
Puntos: 774
Respuesta: Agrupar resultados de una consulta

eso y un between que diferencia tienen? a menos que los valores que estas usando en el row_number los estes usando como si fueran cadenas.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 08/05/2014, 14:07
 
Fecha de Ingreso: abril-2014
Ubicación: Bogota
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Agrupar resultados de una consulta

gracias libras.

Etiquetas: agrupar, resultados, 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 15:46.