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