sábado, 3 de enero de 2009

DESAFIO SQL (ORDER BY)


El 1 de Septiembre de 2008, Itzik Ben-Gan (MVP Sql Server) publicó en su blog el siguiente desafio http://www.sqlmag.com/Article/ArticleID/100156/sql_server_100156.html, que adaptado al lenguaje sql de Access (a utilizar desde un 'lote sql' del Editor Sql 1.3) queda así :

CREATE TABLE t1 (id identity primary key, f_val Memo not null);
insert into t1 (f_val) values ('100');
insert into t1 (f_val) values ('7.4.250');
insert into t1 (f_val) values ('22.40.5.60.4.100.300.478.19710212');
insert into t1 (f_val) values ('22.40.5.60.4.99.300.478.19710212');
insert into t1 (f_val) values ('22.40.5.60.4.99.300.478.9999999');
insert into t1 (f_val) values ('10.30.40.50.20.30.40');
insert into t1 (f_val) values ('7.4.250');

/*Aquí está la salida deseada:

id******f_val

----------------------------------------
7*******7.4.250
2*******7.4.250
6*******10.30.40.50.20.30.40
5*******22.40.5.60.4.99.300.478.9999999
4*******22.40.5.60.4.99.300.478.19710212
3*******22.40.5.60.4.100.300.478.19710212
1*******100

Puntos extra si su solución también apoyará negativos.
Añádanse los siguientes datos de ejemplo para poner a prueba los negativos: */

insert into t1 (f_val) values ('-1');
insert into t1 (f_val) values ('-2');
insert into t1 (f_val) values ('-11');
insert into t1 (f_val) values ( '-22' );
insert into t1 (f_val) values ('-123');
insert into t1 (f_val) values ('-321');
insert into t1 (f_val) values ('22.40.5.60.4.-100.300.478.19710212');
insert into t1 (f_val) values ('22.40.5.60.4.-99.300.478.19710212');

/*Incluida la salida deseada, los valores negativos:
id******f_val
----------------------------------------
13******-321
12******-123
11******-22
10******-11
9*******-2
8*******-1
7*******7.4.250
2*******7.4.250
6*******10.30.40.50.20.30.40
14******22.40.5.60.4.-100.300.478.19710212
15******22.40.5.60.4.-99.300.478.19710212
5*******22.40.5.60.4.99.300.478.9999999
4*******22.40.5.60.4.99.300.478.19710212
3*******22.40.5.60.4.100.300.478.19710212
1*******100


Solución (Ramon Poch, raipon, Terrassa a 03/01/2009) :
La publicaré, Dios mediante, dentro de 15 dias : el 18/01/2009.

*/

... pues eso, el 18/01/2009 publicaré mi solución a este problema. Sin embargo les animo a que me envien por correo (mirar en la parte de abajo de esta página) sus propias conclusiones, y las publicaré.
Cabe decir que si utilizamos una función creada desde vba en nuestra consulta, la solución puede ser más sencilla. Pero dado que se puede lograr exclusivamente mediante sql y las funciones vba disponibles ordinariamente en el entorno sql, creo preferible ceñirse a este contexto. En el fondo esto no es un trabajo profesional, tan solo un reto.
Naturalmente a estas alturas, en el blog de Itzik ya están colgadas varias soluciones a este reto, adaptadas a sql server. La solución mia la he diseñado antes de mirar dichas propuestas. No tendria sentido plantearlo de otra forma, ¿ cierto ?.