Cursores y Reporte personalizado

Cursores y reporte personalizado

En este artículo se utiliza un cursor para mostrar las compras de los clientes y crear un reporte personalizado, siempre se recomienda usar con cuidado los cursores, estos consumen recursos importantes en el servidor, siempre que use un cursor evalúe usar si es posible otras opciones, además de que la instrucción Select del cursor tenga solamente los campos necesarios y los filtros adecuados.

Para mayor información ver:
Variables tipo tabla
Cursores en Store procedures
Procedimientos almacenados
Cursores y pivot

Usando la base de datos Northwind

use Northwind
go

Un cursor para reportar los clientes, los productos comprados y la cantidad de unidades

Declare cursorClientesCompras cursor 
	for 
	select 
		C.CompanyName As 'Cliente', '' As Producto,'' As Cantidad
	from Customers As C
	join Orders As O on C.CustomerID = O.CustomerID
	join [Order Details] As D on O.OrderID = D.OrderID
	join Products As P on D.ProductID = P.ProductID
Union
select 
		C.CompanyName As 'Cliente', 
		P.ProductName As Producto, sum(D.Quantity) As Cantidad
	from Customers As C
	join Orders As O on C.CustomerID = O.CustomerID
	join [Order Details] As D on O.OrderID = D.OrderID
	join Products As P on D.ProductID = P.ProductID
	group by C.CompanyName , P.ProductName 
order by Cliente, Producto
Open cursorClientesCompras
Declare @Reporte table (NombreCliente nvarchar(50), NombreProducto nvarchar(50), Cantidad Numeric(9,2))
Declare @NombreCliente nvarchar(50), @NombreProducto nvarchar(50), @Cantidad Numeric(9,2)
Fetch cursorClientesCompras into @NombreCliente , @NombreProducto, @Cantidad
Declare @Puntero int = 0, @Anterior nvarchar(50)
while (@@FETCH_STATUS = 0)
	Begin
		if @Puntero = 0
			Begin
				Set @Anterior = @NombreCliente
				insert into @Reporte values (@NombreCliente , @NombreProducto, @Cantidad)
				Set @Puntero = 1
			End
		Else
			Begin
				if @NombreCliente = @Anterior
					Begin
						insert into @Reporte values ('' , @NombreProducto, @Cantidad)
					End
			Else
					Begin
						insert into @Reporte values (@NombreCliente , @NombreProducto, @Cantidad)
						Set @Anterior = @NombreCliente
					End
			End
		Fetch cursorClientesCompras into @NombreCliente , @NombreProducto, @Cantidad
	End
Close cursorClientesCompras
Deallocate cursorClientesCompras
select NombreCliente As 'Cliente', NombreProducto As 'Producto', Cantidad
	from @Reporte
go

El resultado se muestra en la siguiente imagen

Cursor y reporte personalizado

Particionando una tabla horizontalmente

Particionando una tabla horizontalmente

Las tablas en cualquier base de datos guardan la información de los registros, una tabla que tiene muchos registros puede considerarse una tabla crítica, aquella que al consultar o buscar registros demore y cause problemas en los sistemas. Las tablas con muchos registros deben particionarse, para obtener el mejor resultado de la partición la base de datos debería tener varios archivos divididos en varios grupos de archivos en varios discos. (Ver Creación de base de datos). En este artículo mostramos como crear tablas particionadas horizontalmente donde el campo de partición es la clave primaria y donde no lo es.

Seguir leyendo

Cursores y Pivot en SQL Server

Cursores y Pivot en SQL Server

En este artículo se utiliza un cursor para mostrar las ventas de los productos en un año determinado, siempre se recomienda usar con cuidado los cursores, estos consumen recursos importantes en el servidor, siempre que use un cursor evalúe usar si es posible otras opciones, además de que la instrucción Select del cursor tenga solamente
los campos necesarios y los filtros adecuados.

Seguir leyendo

Cursores con variable tipo tabla y contadores

Cursor con variable tipo tabla y contadores

En este artículo se utiliza un cursor para mostrar un reporte de acuerdo a registros que tienen valores enteros, de los cuales se hace un análisis para insertar registros en el reporte como entradas y salidas.

Seguir leyendo

Tipos de datos en SQL Server

Tipos de datos en SQL Server

En este artículo se describen los tipos de datos de SQL Server, se sugiere simplificar sus diseños utilizando solamente los necesarios.

Seguir leyendo

Moviendo tablas entre Filegroups en SQL Server

Moviendo tablas de un Filegroup a otro en SQL Server

Una base de datos en SQL Server se puede crear con varios archivos donde se guarda la información de las tablas, estos archivos se agrupan en Grupos de archivos llamados Filegroups, cada grupo de archivos puede tener archivos ubicados en diferentes discos y en diferentes carpetas, el objetivo es que la información de las tablas se almacene en archivos diferentes lo que puede optimizar la distribución de la información guardada en la base de datos.

Seguir leyendo

Construyendo CTE en SQL Server

Construyendo CTE

En este artículo se explicará como construir una CTE, Common Table Expressión o Expresión de tabla común, sus usos son muy diversos y necesarios para simplificar consultas con referencias a varias tablas o con muchos filtros.

Seguir leyendo

Select For XML Path SQL Server

Uso de For XML Path en SQL Server

Una consulta Select (Ver Select) se puede mostrar en formato XML (Ver Campos XML), utilizando la opción FOR XML, la cual tiene varios modos, uno de estos es el modo PATH.

Seguir leyendo

Coalesce SQL Server

Usando la función Coalesce

En una base de datos es una buena práctica que no existan valores Null, esto se puede evitar usando la restricción de tipo Default y desde la aplicación el programador puede enviar un dato predeterminado en los campos que el usuario no ingrese valor. (Ver Crear tablas)

Seguir leyendo

Where filtrado de registros SQL Server

Filtrando registros con Where

El filtro de registros al hacer consultas permite seleccionar los datos que se requieren usando comparaciones de dos datos del mismo tipo y crear una expresión lógica con las condiciones que deben de cumplir los registros a seleccionar.

Seguir leyendo