Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Tengo un fichero que contiene:
- Código
- Tipo
- Atributo
Hay varios registros con el mismo Código y cada uno tiene un tipo y valor diferente
Hay 5 Tipos diferentes
Quiero conseguir un fichero que contenga:
- Código
- Atributo 1
- Atributo 2
...
- Atributo 5
Tengo alguna solución pero no me gusta demasiado y busco otra solución mas eficiente
Gracias anticipadas.
Saludos,
Enrique Colomer
Hola Enrique:
Por lo que comentas entiendo que los Códigos se repiten para los los cinco Tipos y que existen todos los tipos para cada código, de forma que el atributo de Tipo1 debe corresponder al campo Atributo1, el atributo de Tipo2 al Atributo2, etc.
Actual:
load * Inline [
Codigo,Tipo,Atributo
A,T1,10
A,T2,20
A,T3,30
A,T4,40
A,T5,50
B,T1,10
B,T2,20
B,T2,30
B,T4,40
B,T5,50
C,T1,10
C,T2,20
C,T3,30
C,T4,40
C,T5,50
];
Se me ocurre crear tablas auxiliares con cada grupo de registros del mismo código y asignar el valor del atributo a variables que se inserten en una nueva tabla con los cinco nuevos campos.
Let vNumCodigos = FieldValueCount('Codigo');
Let vNumTipo = 5;
for i=1 to $(vNumCodigos)
let vCodigo = FieldValue('Codigo', $(i));
let vTipo = FieldValue('Tipo',$(j));
Tmp:
load
Codigo,
Tipo,
Atributo as AtributoTmp
resident Actual
where Codigo='$(vCodigo)'
order by Tipo;
for j=1 to $(vNumTipo)
let vAtributo$(j) = Peek('AtributoTmp',$(j)-1);
next
drop table Tmp;
Nueva:
load * inline [
Codigo, Atributo 1, Atributo 2, Atributo 3, Atributo 4, Atributo 5
$(vCodigo), $(vAtributo1), $(vAtributo2), $(vAtributo3), $(vAtributo4), $(vAtributo5)
];
next;
Espero que te sea útil.
Un saludo
Hola Enrique,
Yo te recomiendo, como solución eficiente, usar mapping load y applymap(). Rinde mucho mejor que hacer joins. El siguiente código se puede reducir, pero creo que se entiende mejor paso por paso.
La posible solución sería:
MapaTipo1:
Mapping Load
Codigo,
Atributo
From <origen datos tipo 1>;
//[...]
MapaTipo5:
Mapping Load
Codigo,
Atributo
From <origen datos tipo 5>;
//Luego, asegurarte de que tienes una tabla con todos los códigos distintos:
TempCodigos:
Load
Codigo
From <origen datos tipo 1>;
Concatenate load
Codigo
From <origen datos tipo 2>;
//[...]
Concatenate load
Codigo
From <origen datos tipo 5>;
//Quitar los repetidos
TempCodigos2:
Load distinct
Codigo
Resident TempCodigos;
Drop table TempCodigos;
//Finalmete añadir los atributos con applymap()
TablaResultado:
Load
Codigo,
ApplyMap('MapaTipo1',Codigo) as Atributo1,
//...
ApplyMap('MapaTipo1',Codigo) as Atributo5
Resident TempCodigos2;
Drop table TempCodigos2;