none
Agrupar resultados RRS feed

  • Pregunta

  • 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

    martes, 6 de mayo de 2014 21:14

Respuestas

  • Ronald,

    Creo que deberias ordenar por [DocDate] en forma descendente para enumerar de acuerdo a la fecha mas reciente.

    ;with C1 as (
    select
    ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod 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
    )
    select * 
    from C1
    where nro < 6;
    GO


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Joser19 jueves, 8 de mayo de 2014 20:50
    miércoles, 7 de mayo de 2014 2:20

Todas las respuestas

  • Pasanos la estructura de tus tablas 
    martes, 6 de mayo de 2014 22:15
  • 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

    select 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
    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 1152014-02-25 00:00:00.000
    L1-001 NOVEX 1152014-02-27 00:00:00.000
    L1-001 NOVEX 1152014-03-04 00:00:00.000
    L1-001 NOVEX 1152014-03-06 00:00:00.000
    L1-001 NOVEX 1152014-03-07 00:00:00.000
    L1-001 NOVEX 1152014-03-07 00:00:00.000
    L1-001 NOVEX 1152014-03-13 00:00:00.000
    L1-001 NOVEX 1152014-03-15 00:00:00.000
    L1-001 VARGA 3002010-11-25 00:00:00.000
    L1-001 VARGA 3002011-06-22 00:00:00.000
    L1-001 VARGA 3002011-07-13 00:00:00.000
    L1-001 VARGA 3002012-03-22 00:00:00.000
    L1-001 VARGA 3002012-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:


    select
    ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod ORDER BY V.ItemCode) [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

    pero no se donde la condiciono para que solo me muestre 5

    gracias por sus respuestas


    • Editado Joser19 martes, 6 de mayo de 2014 22:50
    martes, 6 de mayo de 2014 22:49
  • No he podido fijarme bien en tu estructura ni en tu query, pero tomando la ultima que posteaste podrias considerar esto?

    select * from (select
    ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod ORDER BY V.ItemCode) 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) as t
    where t.nro < 6

    Si no es lo que buscas luego lo miro con mas detenimiento si antes no te ayuda ya otro forista.

    Saludos!

    miércoles, 7 de mayo de 2014 1:54
  • Ronald,

    Creo que deberias ordenar por [DocDate] en forma descendente para enumerar de acuerdo a la fecha mas reciente.

    ;with C1 as (
    select
    ROW_NUMBER() OVER(PARTITION BY B.ItmsGrpCod 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
    )
    select * 
    from C1
    where nro < 6;
    GO


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Joser19 jueves, 8 de mayo de 2014 20:50
    miércoles, 7 de mayo de 2014 2:20
  • Hola  que pena volver a molestar, lo que pasa es que la consulta no me esta arrojando lo que necesito miren, con la consulta sin poner el where:

    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

    lo agrupe por fecha como dijo Hunchback 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 dijron iba a obtener solo los 5 primeros pero no es asi hize la siguiente consulta :

    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 nro <=6

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

    Nro ItemCode ItmsGrpCod DocDate
    2 L1-001 EXTRA115 2014-03-11 00:00:00.000
    4 L1-001 EXTRA115 2014-03-07 00:00:00.000
    6 L1-001 EXTRA115 2014-03-06 00:00:00.000
    2 L1-001 NOVEX115 2014-03-13 00:00:00.000
    4 L1-001 NOVEX115 2014-03-07 00:00:00.000
    6 L1-001 NOVEX115 2014-03-04 00:00:00.000
    1 L1-001 VARGA300 2012-03-23 00:00:00.000
    3 L1-001 VARGA300 2011-07-13 00:00:00.000
    5 L1-001 VARGA300 2010-11-25 00:00:00.000
    2 L1-009166 124 2013-09-17 00:00:00.000
    4 L1-009166 124 2013-04-22 00:00:00.000
    6 L1-009166 124 2011-04-30 00:00:00.000
    2 L10-100001 131 2014-03-18 00:00:00.000
    4 L10-100001 131 2014-03-14 00:00:00.000
    6 L10-100001 131 2014-03-13 00:00:00.000
    2 L10-100002 131 2014-03-12 00:00:00.000
    4 L10-100002 131 2014-03-05 00:00:00.000
    6 L10-100002 131 2014-02-18 00:00:00.000
    2 L10-100003 131 2014-03-14 00:00:00.000
    4 L10-100003 131 2014-03-14 00:00:00.000
    6 L10-100003 131 2014-03-12 00:00:00.000
    2 L10-100004 131 2014-02-20 00:00:00.000
    4 L10-100004 131 2014-02-12 00:00:00.000
    6 L10-100004 131 2014-02-05 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
    1 L10-101820 /240 /2013-08-30 00:00:00.000
    3 L10-101820 /240 /2013-06-14 00:00:00.000
    5 L10-101820 / 240/ 2013-05-08 00:00:00.000
    1 L10-101821/155/2011-03-17 00:00:00.000
    1 L10-101822  /155 /2014-03-06 00:00:00.000
    3 L10-101822 155 2014-02-21 00:00:00.000
    5 L10-101822 155 2014-02-05 00:00:00.000

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

    • Editado Joser19 miércoles, 7 de mayo de 2014 22:14
    miércoles, 7 de mayo de 2014 22:11
  • Mi recomendacion es que postees la estructura de las tablas, data de ejemplo en forma de sentencias insert asi como el resultado esperado. De esa forma no tendremos que adivinar nombre de columnas, restricciones, etc. Tampoco tendremos que mal gastar nuestro tiempo tratando de reproducer tu ambiente.

    Ayudanos para poderte ayudar.


    AMB

    Some guidelines for posting questions...

    jueves, 8 de mayo de 2014 0:21
  • hola bueno voy a tratar de explicarles mejor, cuando hago esta consulta:

    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

    me arroja una tabla como esta:

    CREATE TABLE #temp
    (
    Nro INT,
    ItemCode    VARCHAR(20),
    ItmsGrpCod  INT,
    DocDate datetime
    )
     
    INSERT INTO #temp VALUES (1,'L1-001 EXTRA',115,'2014-03-12 00:00:00.000')
    INSERT INTO #temp VALUES (2,'L1-001 EXTRA',115,'2014-03-11 00:00:00.000')
    INSERT INTO #temp VALUES (3,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
    INSERT INTO #temp VALUES (4,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
    INSERT INTO #temp VALUES (5,'L1-001 EXTRA',115,'2014-03-07 00:00:00.000')
    INSERT INTO #temp VALUES (6,'L1-001 EXTRA',115,'2014-03-06 00:00:00.000')
    INSERT INTO #temp VALUES (7,'L1-001 EXTRA',115,'2014-02-21 00:00:00.000')
    INSERT INTO #temp VALUES (8,'L1-001 EXTRA',115,'2014-02-19 00:00:00.000')
    INSERT INTO #temp VALUES (9,'L1-001 EXTRA',115,'2014-02-11 00:00:00.000')
    INSERT INTO #temp VALUES (10,'L1-001 EXTRA',115,'2014-02-05 00:00:00.000')
    INSERT INTO #temp VALUES (11,'L1-001 EXTRA',115,'2014-02-03 00:00:00.000')
    INSERT INTO #temp VALUES (12,'L1-001 EXTRA',115,'2014-02-01 00:00:00.000')
    INSERT INTO #temp VALUES (13,'L1-001 EXTRA',115,'2014-01-28 00:00:00.000')
    INSERT INTO #temp VALUES (14,'L1-001 EXTRA',115,'2014-01-23 00:00:00.000')
    INSERT INTO #temp VALUES (15,'L1-001 EXTRA',115,'2014-01-21 00:00:00.000')
    INSERT INTO #temp VALUES (16,'L1-001 EXTRA',115,'2014-01-18 00:00:00.000')
    INSERT INTO #temp VALUES (17,'L1-001 EXTRA',115,'2014-01-02 00:00:00.000')
    INSERT INTO #temp VALUES (18,'L1-001 EXTRA',115,'2013-12-30 00:00:00.000')
    INSERT INTO #temp VALUES (19,'L1-001 EXTRA',115,'2013-12-28 00:00:00.000')
    INSERT INTO #temp VALUES (20,'L1-001 EXTRA',115,'2013-12-18 00:00:00.000')
    INSERT INTO #temp VALUES (1,'L1-001 NOVEX',115,'2014-03-15 00:00:00.000')
    INSERT INTO #temp VALUES (2,'L1-001 NOVEX',115,'2014-03-13 00:00:00.000')
    INSERT INTO #temp VALUES (3,'L1-001 NOVEX',115,'2014-03-07 00:00:00.000')
    INSERT INTO #temp VALUES (4,'L1-001 NOVEX',115,'2014-03-07 00:00:00.000')
    INSERT INTO #temp VALUES (5,'L1-001 NOVEX',115,'2014-03-06 00:00:00.000')
    INSERT INTO #temp VALUES (6,'L1-001 NOVEX',115,'2014-03-04 00:00:00.000')
    INSERT INTO #temp VALUES (7,'L1-001 NOVEX',115,'2014-02-27 00:00:00.000')
    INSERT INTO #temp VALUES (8,'L1-001 NOVEX',115,'2014-02-25 00:00:00.000')
    INSERT INTO #temp VALUES (9,'L1-001 NOVEX',115,'2014-02-22 00:00:00.000')
    INSERT INTO #temp VALUES (10,'L1-001 NOVEX',115,'2014-02-22 00:00:00.000')
    INSERT INTO #temp VALUES (11,'L1-001 NOVEX',115,'2014-02-19 00:00:00.000')

    pero con muchisimos mas datos donde Nro es lo que me trajo el row_number  seria facil decir que me llame cada item mientras nro este entre 1 y 5 con el between pero cuando hago eso en vez de mostrarme los 5 primeros de cada item me muestra un intervalo algo asi 

    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


    • Editado Joser19 jueves, 8 de mayo de 2014 16:19
    jueves, 8 de mayo de 2014 16:17