Algunos llaman a las tablas de dimensiones tablas de lookup; yo me niego. Con SAS ya hemos visto cómo crear cruces de tablas de dimensiones con tablas de hechos a través de formatos; bajo mi punto de vista, el método más eficiente. Pero hoy quería traeros un ejemplo de cruce de tabla pequeña con tabla grande a través de array multidimensionales con SAS. Se trata de guardar los valores de la tabla pequeña en un array temporal multidimensional cuando leemos la tabla grande. Para ilustrar esta tarea, he preparado un ejemplo:

data aleatorio;
    do i = 1 to 2000;
        grupo = round(1 + 3 * ranuni(4));
        importe = ranuni(34) * grupo * 1000;
        output;
    end;
run;

proc summary data=aleatorio nway;
    class grupo;
    output out=medias (keep=grupo importe) mean(importe)=;
run;

Generamos un conjunto de datos SAS aleatorio con una variable grupo y una variable importe, calculamos la media del importe por grupo y deseamos medir registro a registro la diferencia con respecto a la media del grupo. Para estos casos podemos trabajar con formatos o, por ejemplo, con macrovariables:

data _null_;
    set medias;
    if grupo = 1 then call symput('med1', importe);
    if grupo = 2 then call symput('med2', importe);
    if grupo = 3 then call symput('med3', importe);
    if grupo = 4 then call symput('med4', importe);
run;

data aleatorio_diff;
    set aleatorio;
    if grupo = 1 then dif = importe / &med1. - 1;
    else if grupo = 2 then dif = importe / &med2. - 1;
    else if grupo = 3 then dif = importe / &med3. - 1;
    else if grupo = 4 then dif = importe / &med4. - 1;
run;

Estoy de acuerdo en que este código se puede hacer más eficiente, pero sigue siendo algo engorroso. Bien, hoy quería plantearos otra forma de hacerlo a través de array multidimensionales. Planteo el código, lo ejecutáis y comentamos:

data aleatorio_final;
    array med(4) _temporary_;
    if _n_ = 1 then do i = 1 to 4;
        set medias;
        med(grupo) = importe;
    end;
    set aleatorio;
    dif = importe / med(grupo) - 1;
run;

Se trata de recorrer nuestra tabla de dimensiones (en este caso, la tabla con las medias) y meter su contenido en un array temporal que denomino med. Posteriormente leo la tabla de hechos y empleo el campo grupo para seleccionar el elemento del array que deseo. Es un código sencillo de replicar, sobre todo si nuestras variables índices (en este caso la variable grupo) son números; en otro caso el código se complica ligeramente, pero sigue siendo sencillo de interpretar. Estoy seguro de que este truco SAS puede resultaros útil (sobre todo a algún pésimo jugador de golf). Saludos.