martes, 15 de mayo de 2007

Función de agrupación Group and agregación Sum en SQL

Las funciones de agrupación y agregación operan sobre conjuntos de filas para dar un resultado por grupo.

GROUP BY permite agrupar informacion por columnasSUM suma los valores

Mediante la clausula GROUP BY se dividen las filas que devuelve una consulta en pequeños grupos. Cuando hagamos uso de esta clausula hay que tener en cuenta que todas las columnas que pongamos en el SELECT y que NO estén en la cláusula GROUP BY, deberán estar en una función de agrupación.

==INCORRECTO==
SELECT FECHA, MONTOFROM INGRESOS
GROUP BY FECHA

==CORRECTO==
SELECT FECHA, SUM (MONTO)
FROM INGRESOS
GROUP BY FECHA

A Continuación un ejemplo de como podemos obtener los ingresos generados por cada uno de los conceptos correspondientes a cada dia.


================================================
==TABLA INGRESOS==
FECHA CONCEPTOID NOMBRE MONTO
2/16/2007 9 DONATIVOS 1000.00
2/28/2007 4 VENTAS 100.00
2/22/2007 9 DONATIVOS 120.00
2/22/2007 9 DONATIVOS 250.00
2/22/2007 4 VENTAS 100.00
2/23/2007 9 DONATIVOS 120.00

================================================
==SENTENCIA==
SELECT FECHA, CONCEPTOID, NOMBRE, SUM(MONTO)
FROM INGRESOS
GROUP BY FECHA, CONCEPTOID, NOMBRE
ORDER BY FECHA

==RESULTADO==
FECHA CONCEPTOID NOMBRE MONTO
2/16/2007 9 DONATIVOS 1000.00
2/22/2007 4 VENTAS 100.00
2/22/2007 9 DONATIVOS 370.00
2/23/2007 9 DONATIVOS 120.00
2/28/2007 4 VENTAS 100.00

Como podemos observar para este caso sencillo, habia dos ingresos por concepto de DONATIVOS en una misma fecha 2/22/2007, y en nuestra consulta se suman ambos registros mediante el uso de la agrupación y agregación.

viernes, 20 de abril de 2007

AJAX Load

Un generador de imagenes de Carga?? Si, Ajax Load es un generador de imágenes animadas de carga que dan la impresión de movimiento, mientras que se está cargando algún contenido o se está realizando una acción. Simplemente seleccionas los colores, el tipo de imágen que quieres utilizar y listo.

jueves, 22 de febrero de 2007

SQL - Obtener registros que se encuentren en un rango de fechas (Fecha inicial y Fecha Final)

Es algo comun sobre todo al momento de realizar reportes, el querer obtener registros que se encuentren en un determinado rango de fechas. Existen varias formas de realizarlo, a continuacion un ejemplo sencillo de como podemos llevar acabo esta operacion. En este ejemplo, deseamos obtener todos los registros del 16 de enero al 15 de febrero, incluyendo estos dias.

Si las fechas que deseamos comparar son de tipo DateTime debemos tener en cuenta que las fechas incluyen Dia, Mes, Anyo, Minutos, Segundos y Milisegundos. De esa forma, una fecha '15-02-2007 59:59.998' es valida para nuestra consulta.



-- Declaramos las fechas inicial y final respectivamente
DECLARE @FechaInicial AS DATETIME
DECLARE @FechaFinal AS DATETIME

-- Asignamos las fechas (Pueden ser recibidas en un
--stored procedure)
SET @FechaInicial = '16-01-2007 00:00'
SET @FechaFinal = '15-02-2007 00:00'

--========================================================
-- Si los valores son recibido en un Stored, es necesario
-- verificar que realmente queden en el formato anterior.
SET @FechaInicial = CONVERT(VARCHAR,@FechaInicial, 105) + ' 00:00'
SET @FechaFinal = CONVERT(VARCHAR, @FechaFinal, 105) + ' 00:00'
--========================================================

-- A la fecha final le sumamos un 1 dia, y obtenemos todas
-- las fechas que sean igual o mayor a '16-01-2007 00:00'
-- y sean menores a '16-02-2007 00:00'.
-- Mucho cuidado, ya que si la @FechaFinal tiene siquiera
-- milisegundos, podemos llegar a obtener registros no deseados.

SELECT *
FROM TuTabla AS T
WHERE (T.Fecha >= @FechaInicial AND T.Fecha < DATEADD(DAY, 1, @FechaFinal))

martes, 16 de enero de 2007

SQL - Recomendaciones

Recomendaciones para su uso en SQL:
  • No hacer uso de sp_ al inicio de los procedimientos almacenados.
  • Cuando realicemos consultas, hacer uso de WITH(NOLOCK) para no bloquear las tablas inecesariamente.
  • Utilizar parámetros de entrada y de salida para procedimientos almacenados.
  • Hacer uso de RETURN cuando vayamos a regresar un valor entero, en lugar de develver ese valor mediante un SELECT.
  • Utilizar transacciones y controlar los errores en los procedimientos almanacenados.
  • Emplear errores personalizados.
Las anteriores son solo recomendaciones y se debe analizar en que momento hacer uso de las mismas.

SQL - Eliminar multiples registros de una tabla.

SQL - Eliminar multiples registros de una tabla. Muchas veces requerimos eliminar más de un registro y que estos cumplan con una serie de requerimientos. Imaginense tener que eliminar más de 10,000 registros pero que estos cumplan con ciertas especificaciones, para lo cual tenemos que consultar más de dos tablas. Si lo quisieramos realizar de la manera tradicional, es decir, eliminar registro por registro, es seguro que nos llevaria muchisimo tiempo. Una forma rápida, fácil y segura de eliminar los registros es seguir los siguientes pasos: Ejemplo: Si desearamos eliminar todos los Usuarios de TipoUsuario A y B que pertenezcan a la Empresa 5.
  • 1.- Crear nuestra consulta de los registros que deseamos eliminar. Aqui estamos no estamos considerando que otras tablas hagan referencia a los valores que deseamos eliminar. [Verificar que realmente sean los registros que deseamos eliminar]. Si la consulta es muy compleja o se desea hacer en secciones, puede hacerse uso de tablas temporales para almacenar por ejemplo, los Ids de los registros a eliminar, y posteriormente hacer uso de esa tabla temporal como parte de la restriccion para la eliminacion.d
SELECT * FROM Usuario U INNER JOIN Departamento D ON U.DepartamentoId=D.DepartamentoId INNER JOIN Empresa E ON D.EmpresaId=E.EmpresaId WHERE E.EmpresaId=5 AND U.TipoUsuario IN ('A','B')
  • 2.-Creamos una transaccion.
BEGIN TRAN
  • 3.- Procedemos a eliminar los registros.
DELETE Usuario -- SELECT * FROM Usuario U INNER JOIN Departamento D ON U.DepartamentoId=D.DepartamentoId INNER JOIN Empresa E ON D.EmpresaId=E.EmpresaId WHERE E.EmpresaId=5 AND U.TipoUsuario IN ('A','B')
  • 4.- Verificamos que el total de lineas afectadas hayan coincidan con el total de registros obtenidos en la consulta del paso 1.
Si estamos seguros de eliminar los registros, realizar el commit de la transaccion COMMIT TRAN Si no estamos seguros o sucedio un error, realizamos un rollback a la transaccion ROLLBACK TRAN