miércoles, 23 de abril de 2008

SERIES NUMÉRICAS


Cómo crear series numéricas a partir de una tabla (Nums) con diez dígitos : 0,1,2,3,4,5,6,7,8,9 en el campo Num :

Create Table Nums (Num Long Primary Key);
Insert Into Nums Values (0);
Insert Into Nums Values (1);
Insert Into Nums Values (2);
Insert Into Nums Values (3);
Insert Into Nums Values (4);
Insert Into Nums Values (5);
Insert Into Nums Values (6);
Insert Into Nums Values (7);
Insert Into Nums Values (8);
Insert Into Nums Values (9);

-- de 1 a 100 :

SELECT (TNums_1.Num*10)+Nums.Num+1 AS Número
FROM Nums, Nums AS TNums_1
ORDER BY (TNums_1.Num*10)+Nums.Num+1;

-- de 1 a 1000 :

SELECT (TNums_2.Número*10)+Nums.Num+1 AS Número
FROM
(
Select (TNums_1.Num*10)+Nums.Num As Número
From Nums, Nums AS TNums_1
) AS TNums_2, Nums
ORDER BY (TNums_2.Número*10)+Nums.Num+1;

-- de 1 a 10.000

SELECT (TNums_3.Número*10)+Nums.Num+1 AS Número
FROM
(
Select (TNums_2.Número*10)+Nums.Num As Número
From
(
Select (TNums_1.Num*10)+Nums.Num As Número
From Nums, Nums As TNums_1
) As TNums_2, Nums
) AS TNums_3, Nums
ORDER BY (TNums_3.Número*10)+Nums.Num+1;

-- de 1 a 100.000

SELECT (TNums_4.Número*10)+Nums.Num + 1 AS Número
FROM
(
Select (TNums_3.Número*10)+Nums.Num As Número
From
(
Select (TNums_2.Número*10)+Nums.Num As Número
From
(
Select (TNums_1.Num*10)+Nums.Num As Número
From Nums, Nums As TNums_1
) As TNums_2, Nums
) As TNums_3, Nums
) AS TNums_4, Nums
ORDER BY (TNums_4.Número*10)+Nums.Num + 1;

/*
... etc, la idea es aprovechar, el no relacionar las tablas, para nuestro interés. La clausula Order by, la he incorporado para que si ejecutais estas consultas, obtengais un resultado ordenado y legible, pero obviamente demoran la ejecución de la 'select', así que si incorporais esta consulta dentro de otra, es recomendable eliminar el 'Order by'.

Un ejemplo de las posibles aplicaciones de generar series numéricas de esta forma : una consulta de referencias cruzadas como calendario perpetuo :
*/

PARAMETERS Año Value, Mes Value;
TRANSFORM First(Temp.Número) AS Dia
SELECT CInt(Format(DateSerial(Año,Mes,Temp.Número),"ww",2)) AS Setmana
FROM
(
Select (TNums_1.Num*10)+Nums.Num+1 As Número
From Nums, Nums As TNums_1
Where (TNums_1.Num*10)+Nums.Num+1 <= Day(DateSerial(Año, Mes+1,0))
) AS Temp
GROUP BY CInt(Format(DateSerial(Año,Mes,Temp.Número),"ww",2))
PIVOT WeekdayName(Weekday(DateSerial(Año,Mes,Temp.Número),2),0,2);

-- Eliminamos la tabla de este ejemplo
DROP TABLE Nums;


Ramon Poch. Terrassa a 20/12/2005.