While, For, Loop
Podemos llamarlo como queramos, en SQL solo tenemos una posibilidad de hacer repeticiones y es con un WHILE. La verdad que cada dia me sorprende mas todo lo que se puede llegar a hacer con SQL, y hablando de proyectos en los que muchas personas pican codigo, o sencillamente, pensando en las nuevas versiones o el tema de multiplataforma, intentar gestionar completamente la base de datos desde SQL y no escribir secuencias y secuencias de codigo en unestros programas, cada dia, lo veo la mejor opcion.
Cuantas veces no te has visto con la necesidad de repetir algo un cierto numero de veces en la base de datos. Yo, hasta que he aprendido esto, siemrpe me tocaba hacerlo desde fuera de SQL, con lo que supone mas lineas de codigo y sobre todo mas consultas al servidor de la base de datos, por lo que relentizaba todo el proceso.
La verdad que es muy simple de utilizar, y para los que estamos acostumbrados a tener varias formas de hacer lo mismo, en SQL solo tienes una. Dicho en seudo codigo un MIENENTRAS [condicion] HACER.
Ejemplito rapido
Pongamos un caso practico, que es por lo que necesite buscar este tipo de funciones en SQL.
Necesitamos repetir EXACTAMENTE la misma consulta entre unas fechas determinadas, pero decrementando o incrementando el año. El resultado lo almacenaremos en una tabla temporal y luego presentamos los datos.
begin
declare @start_date DATE; --custom start
declare @end_date DATE; --custom end
declare @season int; --select a season in order 1 to 4, other number use the date provide
declare @repeat int; --number of years to query, minimun 1
declare @c int; --counter
select @season = 1
select @start_date = '2016-09-22', @end_date = '2016-09-23' --custom
if @season = 1 select @start_date = '2017-03-20', @end_date = '2017-06-21' --spring
if @season = 2 select @start_date = '2017-06-21', @end_date = '2017-09-22' --summer
if @season = 3 select @start_date = '2017-09-22', @end_date = '2017-12-21' --autumn
if @season = 4 select @start_date = '2016-12-21', @end_date = '2017-03-20' --winter
declare @start_dateMinusOne date;
declare @end_dateMinusOne date;
declare @temptable table(prodname varchar(30),variety varchar(30), lots int, price int) -- amt decimal(10,2));
set @repeat = 3 --last x years
set @c = 0 --counter
if @repeat < 1 set @repeat = 1
while @c < @repeat
begin
--repeat every years selected
set @start_dateMinusOne = (select DATEADD(YEAR,(-1*@c),@start_date)) --remove number of the year with the counter
set @end_dateMinusOne = (select DATEADD(YEAR,(-1*@c),@end_date)) --remove number of the year with the counter
insert into @temptable
SELECT distinct(p.prodname) as
p.prodname, p.variety,
s.lotssold,s.priceunit
FROM sales s inner join supplies a on a.supplyno = s.supplyno
inner join product p on a.prodnum=p.prodnum
WHERE s.grade < 3
and s.lotssold > 0
AND s.[Date] >= @start_dateMinusOne --@start_date
AND s.[Date] <= @end_dateMinusOne --@end_date
set @c = @c+1 --increase counter
end
--show info
select distinct prodname, variety, sum(lots) as lots,
cast(cast(sum(lots * price) as decimal(10,2))/coalesce(nullif(sum(lots),0),1) / 100 as decimal(10,2)) as price
from @temptable
where lots > 0
group by prodname, variety
order by 3 desc, prodname, variety
end
Como podeis ver es una simple consulta para obtener las ventas dentro de las estaciones del año o suministrando unas fechas personalizadas.
happy codding ;p
#SQL #trucos