none
Como saber el número que más se repite en una colección de filas en un DatagridView? RRS feed

  • Pregunta

  • Buenas, tengo una tabla llamada Detalle de factura donde se registran los productos vendidos, la cantidad, precio, sub total etc.. y me pregunto como puedo calcular el producto que mas se repite EJ:

    Cantidad: Descripción: Precio

    2             ARROZ         15.00

    1            Cervezas       60.00

    4            Queso           30.00

    2            Cervezas       60.00

    En este ejemplo los productos mas vendido son.. Queso,Cervezas,Arroz en ese orden, lo que no se es como hacer dicho calculo. Busco alguna orientación que me pueda encaminar a esto. En estadísticas se llama Moda.


    • Editado Renzo20 domingo, 14 de mayo de 2017 3:25
    domingo, 14 de mayo de 2017 3:24

Respuestas

  • Hola Renzo20

    Una consulta, tu llenas el datagridview desde la base de datos? porque de ser así lo puedes realizar con una simple consulta en vez de recorrer el control, puedes aplicar lo siguiente sobre tu tabla Detalle.

    Select	COUNT(Descripcion) As Cantidad,Descripcion,SUM(Precio) As SumaTotal
    From	Detalle
    Group by Descripcion
    order by COUNT(Descripcion) desc

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.


    • Editado Brayan De La Cruz domingo, 14 de mayo de 2017 4:19 ,
    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:59
    domingo, 14 de mayo de 2017 4:17
  • Si buscas obtener la moda (estadística) según los datos que adjuntas entonces la respuesta es únicamente el producto 'queso' por ser el producto que tiene mayor frecuencia, no 'arroz', no 'cerveza'. De hecho, en el caso que la frecuencia del producto 'cerveza' fuese dos (2) entonces se podría hablar de una distribución bimodal para los productos 'queso' y 'cerveza' por tener -ambos productos- la misma frecuencia (cuatro). Lo que sugieres como resultado (queso, cerveza y arroz) es un informe de los productos más vendidos en unidades, no es el resultado de la moda. 

    En t-sql puedes obtener la moda de la siguiente manera:

    DECLARE @Ventas table (Cantidad int, Producto varchar(20));
    INSERT INTO @Ventas VALUES
        (2, 'Arroz'), (1, 'Cerveza'), (4, 'Queso'), (2, 'Cerveza');
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Queso                4
    
    /*En caso haya dos productos con la misma frecuencia*/
    UPDATE @Ventas SET Cantidad = 2 WHERE Producto = 'Cerveza';
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Cerveza              4
    --Queso                4

    La misma lógica has de ocupar sea que el origen de datos sea un objeto de tipo DataTable, List<T> o DataGridView, que no mencionas si los datos están vinculados o agregados al control DataGridView.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:47
    domingo, 14 de mayo de 2017 5:26
  • Claro, eso es la moda (en este caso puntual se trata de una distribución bimodal) y la solución al problema es la que ya te he propuesto, por ejemplo con los nuevos datos que adjuntas:

    DECLARE @Ventas table (Cantidad int, Producto varchar(20));
    INSERT INTO @Ventas VALUES
        (2, 'Cerveza presidente'), (3, 'Queso chedar'), 
        (2, 'Queso chedar'), (1, 'Arroz'), (5, 'Coca Cola');
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Coca Cola            5
    --Queso chedar         5


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:47
    domingo, 14 de mayo de 2017 15:49
  • Hola:
    Si las consultas devuelven el mismo numero y tipo de campos, puedes hacer lo siguiente

    Consulta1
    union
    consulta2

    Ejemplo:
    La tabla products de la base de datos Northwind tiene 77 productos
    Si ejecuto estas 2 consultas
    select productid, sum(quantity) as total from [order details] where productid<=30 group by productid
    union
    select productid, sum(quantity) as total from [order details] where productid>30 group by productid
    Es igual que si ejecuto esta consulta

    select productid, sum(quantity) as total from [order details] group by productid

    El datatable que se consigue con la union de consultas, es el que carga el fichero RPT de cristal

    P.D.
    Espero que se entienda

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo20 lunes, 15 de mayo de 2017 15:46
    • Desmarcado como respuesta Renzo20 lunes, 15 de mayo de 2017 15:46
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:53
    lunes, 15 de mayo de 2017 9:02
  • Hola:

    Si todos los datos que necesitas para el informe de cristal son numericos, ¿como la estructura NO tiene ningun campo numerico?
    No entiendo NADA

    Te pongo este ejemplo para la estructura de la tabla [Order Details] de la base de datos Northwind

    CREATE TABLE [Order Details] (
     [OrderID] [int] NOT NULL ,
     [ProductID] [int] NOT NULL ,
     [UnitPrice] [money] NOT NULL ,
     [Quantity] [smallint] NOT NULL ,
     [Discount] [real] NOT NULL

    Un saludo desde Bilbo
    Carlos


    • Editado J. Carlos Herrero martes, 16 de mayo de 2017 7:51
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:53
    martes, 16 de mayo de 2017 7:48
  • Hola, logre resolver lo que quería insertando Sub-informes en CrystalReport, las consulta que tenia para hacer los cálculos las puse c/u en un procedimiento almacenado y use esos sub informes Aunque me hubiera gustado hacer dichos cálculos desde el mismo CrystalReport por mi falta de conocimientos en el uso del CrystalReport opté por esa solución, Pero gracias por sus respuestas.
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:54
    martes, 16 de mayo de 2017 16:53

Todas las respuestas

  • Hola Renzo20

    Una consulta, tu llenas el datagridview desde la base de datos? porque de ser así lo puedes realizar con una simple consulta en vez de recorrer el control, puedes aplicar lo siguiente sobre tu tabla Detalle.

    Select	COUNT(Descripcion) As Cantidad,Descripcion,SUM(Precio) As SumaTotal
    From	Detalle
    Group by Descripcion
    order by COUNT(Descripcion) desc

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.


    • Editado Brayan De La Cruz domingo, 14 de mayo de 2017 4:19 ,
    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:59
    domingo, 14 de mayo de 2017 4:17
  • Si buscas obtener la moda (estadística) según los datos que adjuntas entonces la respuesta es únicamente el producto 'queso' por ser el producto que tiene mayor frecuencia, no 'arroz', no 'cerveza'. De hecho, en el caso que la frecuencia del producto 'cerveza' fuese dos (2) entonces se podría hablar de una distribución bimodal para los productos 'queso' y 'cerveza' por tener -ambos productos- la misma frecuencia (cuatro). Lo que sugieres como resultado (queso, cerveza y arroz) es un informe de los productos más vendidos en unidades, no es el resultado de la moda. 

    En t-sql puedes obtener la moda de la siguiente manera:

    DECLARE @Ventas table (Cantidad int, Producto varchar(20));
    INSERT INTO @Ventas VALUES
        (2, 'Arroz'), (1, 'Cerveza'), (4, 'Queso'), (2, 'Cerveza');
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Queso                4
    
    /*En caso haya dos productos con la misma frecuencia*/
    UPDATE @Ventas SET Cantidad = 2 WHERE Producto = 'Cerveza';
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Cerveza              4
    --Queso                4

    La misma lógica has de ocupar sea que el origen de datos sea un objeto de tipo DataTable, List<T> o DataGridView, que no mencionas si los datos están vinculados o agregados al control DataGridView.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:47
    domingo, 14 de mayo de 2017 5:26
  • Hola, no me exprese correctamente, lo que busco es simplemente el producto que más se vende, aquel cuya cantidad sea mayor, sin embargo el producto puede aparecer varias veces en la colección de filas. EJ: en esta consulta debería arrojarme los siguientes datos Cerveza Presidente 2,Queso Cheddar 5,Arroz 1 Coca Cola 5, como ven se deben sumar las cantidades cuando los productos sean iguales y el resultado final debe ser Queso Cheddar 5, Coca cola 5 (Los productos que mas se venden).

    2 Cervezas Presidente
    3 Queso cheddar
    2 Queso cheddar
    1 Arroz La mejor
    5 Coca Cola
    • Editado Renzo20 domingo, 14 de mayo de 2017 13:58
    domingo, 14 de mayo de 2017 13:20
  • Claro, eso es la moda (en este caso puntual se trata de una distribución bimodal) y la solución al problema es la que ya te he propuesto, por ejemplo con los nuevos datos que adjuntas:

    DECLARE @Ventas table (Cantidad int, Producto varchar(20));
    INSERT INTO @Ventas VALUES
        (2, 'Cerveza presidente'), (3, 'Queso chedar'), 
        (2, 'Queso chedar'), (1, 'Arroz'), (5, 'Coca Cola');
    
    SELECT TOP (1) WITH TIES Producto, SUM(Cantidad) AS [f] FROM @Ventas 
    GROUP BY Producto ORDER BY SUM(Cantidad) DESC;
    
    --Resultado:
    --Producto             f
    ---------------------- -----------
    --Coca Cola            5
    --Queso chedar         5


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Renzo20 domingo, 14 de mayo de 2017 18:47
    domingo, 14 de mayo de 2017 15:49
  • Hola Willams Morales me podrías decir como puedo hacer esto mismo pero en CrystalReport? veras la cosa es que necesito formar un reporte con varias consulta y no solo con una, no se si sea posible, claro usando tu misma lógica osea debo presentar:

    Número de ventas a Credito

    Número de ventas a Contado,

    Numero de Ventas al Por Mayor

    Número de Ventas a Crédito

    y Cantidad de productos Vendidos 

    ya lo tengo en consultas Sql de forma separada, el problema esta en hacerlo en una sola consulta ya que arrojan distintas filas y como son cálculos de una tabla(FacturaDetalle) no se pueden relacionar o usar otra forma para mostrarla en una sola tabla, así que pensé que los mismos cálculos se podían hacer directamente desde el CrystalReport lo cual es la finalidad, lo que intente fue usar Campos Formulas pero no se como seria la Sintaxis de esto. también pensé en Expresiones Sql pero tampoco se como se aria, si pudieras ayudarme nuevamente lo agradecería hermano.


    • Editado Renzo20 lunes, 15 de mayo de 2017 15:52
    lunes, 15 de mayo de 2017 7:26
  • Hola:
    Si las consultas devuelven el mismo numero y tipo de campos, puedes hacer lo siguiente

    Consulta1
    union
    consulta2

    Ejemplo:
    La tabla products de la base de datos Northwind tiene 77 productos
    Si ejecuto estas 2 consultas
    select productid, sum(quantity) as total from [order details] where productid<=30 group by productid
    union
    select productid, sum(quantity) as total from [order details] where productid>30 group by productid
    Es igual que si ejecuto esta consulta

    select productid, sum(quantity) as total from [order details] group by productid

    El datatable que se consigue con la union de consultas, es el que carga el fichero RPT de cristal

    P.D.
    Espero que se entienda

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo20 lunes, 15 de mayo de 2017 15:46
    • Desmarcado como respuesta Renzo20 lunes, 15 de mayo de 2017 15:46
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:53
    lunes, 15 de mayo de 2017 9:02
  • Hola J.Carlos Herrero sucede que al hacer la unión me hace varias consultas en una(Como quiero) el problema es que lo hace en una sola columna si utilizo esa forma en un reporte del crystal no pordria organizarla por secciones EJ:

    Producto que mas se vende en una sección

    Tipo de venta en otra y así sucesivamente. Seria excelente si hubiera una forma de hacer lo mismo pero en columnas o alias separadas 

    lunes, 15 de mayo de 2017 15:51
  • Hola:

    ¿Puedes poner los campos que se van a utilizar en el fichero RPT?
    ¿Puedes poner las estructuras de las tablas implicadas para conseguir los campos que se usan en el fichero RPT?

    Un saludo desde Bilbo
    Carlos

    lunes, 15 de mayo de 2017 19:44
  • FacturaDetalle(Tabla)

    Cantidad varchar(50) false
    DescripciónProducto varchar(500) false
    TipoVenta varchar(50) false

    Esos son los campos que me interesan para lo siguiente...

    Mostrar Productos mas vendidos/Menos Vendido, Mostrar la cantidad vendida a Crédito/Contado, Mostrar los producto con su cantidad de venta al lado (Si el producto se repite debe sumar su cantidad y mostrar el total de de la cantidad para ese producto) Eso es todo lo que quiero presentar en el informe, las consulta ya estan! solo que separadas.


    • Editado Renzo20 lunes, 15 de mayo de 2017 20:39
    lunes, 15 de mayo de 2017 20:37
  • Hola:

    Si todos los datos que necesitas para el informe de cristal son numericos, ¿como la estructura NO tiene ningun campo numerico?
    No entiendo NADA

    Te pongo este ejemplo para la estructura de la tabla [Order Details] de la base de datos Northwind

    CREATE TABLE [Order Details] (
     [OrderID] [int] NOT NULL ,
     [ProductID] [int] NOT NULL ,
     [UnitPrice] [money] NOT NULL ,
     [Quantity] [smallint] NOT NULL ,
     [Discount] [real] NOT NULL

    Un saludo desde Bilbo
    Carlos


    • Editado J. Carlos Herrero martes, 16 de mayo de 2017 7:51
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:53
    martes, 16 de mayo de 2017 7:48
  • Hola, logre resolver lo que quería insertando Sub-informes en CrystalReport, las consulta que tenia para hacer los cálculos las puse c/u en un procedimiento almacenado y use esos sub informes Aunque me hubiera gustado hacer dichos cálculos desde el mismo CrystalReport por mi falta de conocimientos en el uso del CrystalReport opté por esa solución, Pero gracias por sus respuestas.
    • Marcado como respuesta Renzo20 martes, 16 de mayo de 2017 16:54
    martes, 16 de mayo de 2017 16:53
  • Hola Renzo20,

    Gracias por visitar los foros, y compartir con nosotros tu solución.

    Saludos

    Joyce

    __________________________________________________________________________________________
    Por favor, recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, hace que sea más fácil para los otros visitantes encontrar la solución  más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal  cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 16 de mayo de 2017 17:01
    Moderador