martes, 4 de febrero de 2014

Ejecutar COUNT, SUM, MIN, MAX, AVG en SQL desde C#

Bienvenidos sean nuevamente a este sencillo blog de programación, a continuación les presento una forma de ejecutar consultas usando las funciones de agregado más comunes como COUNT (devuelve  la cantidad de registros de una columna), SUM (devuelve la suma de los valores de una columna), MIN (obtiene el registro mínimo de una columna), MAX (obtiene el registro máximo de una columna) y AVG (devuelve el promedio de la columna) en SQL desde C#.

NOTA: La base de datos se realizó en SQL Server Management 2012 y la aplicación en Visual Studio 2012.

Código de la base de datos en SQL

--base de datos de ejemplo
create database bdventas
go
--usamos esta base de datos
use bdventas
go

--creamos una tabla para los vendedores
create table vendedor
(
Id_Vendedor int primary key identity(1,1) not null,
Nombre_Vendedor varchar(20) not null,
Apellidop_Vendedor varchar(20) not null,
Apellidom_Vendedor varchar(20) not null
)
--enseguida una tabla para las ventas
create table ventas
(
Id_Venta int primary key identity(1,1) not null,
Id_Vendedor int foreign key(Id_Vendedor) references vendedor(Id_Vendedor) not null,
Monto_Venta money not null,
Fecha_Venta date not null
)

--insertamos tres vendedores
insert into vendedor values('Hugo','Arellano','Pérez'),
('Andrea','Villegas','Marín'),('Benito','Juárez','García')
--insertamos tres ventas para cada vendedor
insert into ventas values(1,100,'14-01-14'),(1,69,'16-01-14'),(1,500,'30-12-13'),
(2,150,'12-12-13'),(2,3000,'19-01-14'),(2,1010,'30-06-13'),
(3,90,'30-01-14'),(3,600,'25-01-14'),(3,2000,'30-09-13')

--estas son las consultas para las funciones COUNT,SUM,MIN,MAX y AVG
select COUNT(*) from ventas
select SUM(Monto_Venta) from ventas
select MIN(Monto_Venta)from ventas
select MAX(Monto_Venta) from ventas
select AVG(Monto_Venta) from ventas
--se pueden consultar todas juntas
select COUNT(*), SUM(Monto_Venta) , MIN(Monto_Venta), MAX(Monto_Venta) , AVG(Monto_Venta) from ventas
--o consultarlas con un alias
select COUNT(*) as 'Total de ventas',sum(Monto_Venta) as 'Monto Total',MIN(Monto_Venta) as 'Monto Mínimo',
MAX(Monto_Venta) as 'Monto Máximo',AVG(Monto_Venta) as 'Promedio de ventas'  from ventas


Código de la aplicación en C#

Creamos una nueva aplicación:

Agregamos a la forma un Label y un TextBox para cada función además de un botón para actualizar la información (en lugar de un botón podría ser un Timer que actualizara la información cada cierto intervalo de tiempo):

Para cada TextBox asignamos un nombre que los identifique, de igual manera con el Button

Probamos las consultas en SQL Server



Ahora en el evento Onclick del Button btn_actualizar agregamos el código para conectar con la base de datos y realizar las consultas:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//librería para manejo de SQL
using System.Data.SqlClient;

namespace minmaxcountavg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //programamos el evento Click del botón btn_actualizar
        private void btn_actualizar_Click(object sender, EventArgs e)
        {
            //cadena de conexión con la base de datos dbventas
           string cadena_conexion=@"Data Source=HUGUITO;Initial Catalog=bdventas;Integrated Security=True";
           //objeto de conexión
            SqlConnection conexion = new SqlConnection();
            //nuestro comando
            SqlCommand comando = new SqlCommand();
            //asignamos al objeto de conexión la cadena
            conexion.ConnectionString = cadena_conexion;
            //indicamos al comando la conexión
            comando.Connection = conexion;
             //se abre la conexión
            conexion.Open();
            //asignamos al comando la consulta de COUNT
            comando.CommandText = "select COUNT(*) from ventas";
            //guardamos el resultado en el TextBox txt_num_ventas
            txt_num_ventas.Text=(comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de SUM
            comando.CommandText = "select SUM(Monto_Venta) from ventas";
            //guardamos el resultado en el TextBox txt_monto_total
            txt_monto_total.Text = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de MIN
            comando.CommandText = "select MIN(Monto_Venta) from ventas";
            //guardamos el resultado en el TextBox txt_monto_min
            txt_monto_min.Text = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de MAX
            comando.CommandText = "select MAX(Monto_Venta) from ventas";
            //guardamos el resultado en el TextBox txt_monto_max
            txt_monto_max.Text = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de AVG
            comando.CommandText = "select AVG(Monto_Venta) from ventas";
            //guardamos el resultado en el TextBox txt_promedio_ventas
            txt_promedio_ventas.Text = (comando.ExecuteScalar()).ToString();
            //cerramos la conexión
            conexion.Close();
        }
    }

}


Ejecutamos la aplicacion y como podemos observar en la imagen siguiente las consultas de SQL Server y de la aplicación de C# arrojan los mismos resultados:


Realizamos inserciones en la base de datos desde SQL Server y ejecutamos las consultas:

Damos clic al botón Actualizar de la aplicación y podemos observar el cambio en los registros:

Como podemos observar  las cantidades que involucran  a los campos de tipo Money arrojan en C# cuatro decimales por lo que usaremos substring para remover los dos últimos decimales:

Nota: SOLO removemos los decimales NO redondeamos, para dicha tarea pueden consultar las funciones ROUND y FLOOR.


Realizamos los siguientes cambios al código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//librería para manejo de SQL
using System.Data.SqlClient;

namespace minmaxcountavg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //programamos el evento Click del botón btn_actualizar
        private void btn_actualizar_Click(object sender, EventArgs e)
        {
            //cadena de conexión con la base de datos dbventas
           string cadena_conexion=@"Data Source=HUGUITO;Initial Catalog=bdventas;Integrated Security=True";
           //objeto de conexión
            SqlConnection conexion = new SqlConnection();
            //nuestro comando
            SqlCommand comando = new SqlCommand();
            //asignamos al objeto de conexión la cadena
            conexion.ConnectionString = cadena_conexion;
            //indicamos al comando la conexión
            comando.Connection = conexion;
             //se abre la conexión
            conexion.Open();
            //asignamos al comando la consulta de COUNT
            comando.CommandText = "select COUNT(*) from ventas";
            //guardamos el resultado en el TextBox txt_num_ventas
            txt_num_ventas.Text=(comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de SUM
            comando.CommandText = "select SUM(Monto_Venta) from ventas";
            //guardamos el resultado en la variable de tipo cadena sum_ventas
            string sum_ventas = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de MIN
            comando.CommandText = "select MIN(Monto_Venta) from ventas";
            //guardamos el resultado en la variable de tipo cadena min_ventas
            string min_ventas = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de MAX
            comando.CommandText = "select MAX(Monto_Venta) from ventas";
            //guardamos el resultado en la variable de tipo cadena max_ventas
            string max_ventas = (comando.ExecuteScalar()).ToString();
            //asignamos al comando la consulta de AVG
            comando.CommandText = "select AVG(Monto_Venta) from ventas";
            //guardamos el resultado en la variable de tipo cadena avg_ventas
            string avg_ventas =(comando.ExecuteScalar()).ToString();
            //cerramos la conexión
            conexion.Close();
            /*ahora mostramos en los TextBox las cantidades, pero, removemos
             caracteres para mostrar sólo dos decimales, esto con substring
             que inicie desde la posoción 0 (inicio de la cadena) hasta la
             posición final (usamos la función Length para determinar el tamaño de la cadena)
             menos dos caracteres, esto ya que aunque sean cantidades enteras
             o incluso un valor de cero en el TextBox se muestran cuatro decimales*/
            txt_monto_max.Text = max_ventas.Substring(0,(max_ventas.Length-2));
            txt_monto_min.Text = min_ventas.Substring(0, (min_ventas.Length - 2));
            txt_monto_total.Text=sum_ventas.Substring(0,(sum_ventas.Length-2));
            txt_promedio_ventas.Text = avg_ventas.Substring(0, (avg_ventas.Length - 2));
        }
    }

}


Finalmente comprobamos el resultado ejecutando la aplicación: