Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
ecolomer
Master II
Master II

Juntar varios registros ... en uno

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

2 Replies
ssanchez
Partner - Contributor III
Partner - Contributor III

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

Not applicable

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;