
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
