Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
othniel2014
Contributor III
Contributor III

¿ordenar dimensión calculada en table pivote?

Hola,

asumamos que tengo una tabla que contiene datos como los de abajo (actualmente tengo 46 empresas, 7 GroupMask, y una infinidad de Clientes)

  

CompañíaClienteGroupMaskSaldo
JuanVictor150
JuanMarcos133.5
JuanManuel112
JuanPablo2-42
ManuelPablo111
ManuelJuan2-12
MarcosPablo124
MarcosJuan2-30
MarcosVictor2-40
PabloJuan142
PabloMarcos2-23
PabloManuel2-11
VictorMarcos140
VictorJuan2-50

donde GroupMask 1 son Cuentas por Cobrar, y GroupMask 2 son Cuentas por Pagar.

me pidieron hacer estas dos tablas.

en Cuentas por cobrar : Gráfico "Tabla Pivote"; Dimensiones: Compañía, GroupMask1 =if(GroupMask = 1, GroupMask), Cliente;

Expresión: Sum(Saldo)

en cuentas por pagar : Grafico "Tabla Pivote"; Dimensiones: Cliente, GroupMask2 =if(GroupMask = 2, GroupMask), Compañía;

Expresión: Sum(Saldo)

noten que en el segundo gráfico, puse "Cliente" primero, y de ultimo "Compañía", para que me presentaran el mismo esquema.

Para el análisis, ellos a tienen un orden especifico en sus 40 empresas, que han usado por años.

El orden por defecto  de mi ejemplo es: Juan, Manuel, Marcos, Pablo, Victor. para ordenarlos en una forma especifica utilice esto para

ordenar Compañía una expresion: Match(Compañia,'Juan', 'Victor', 'Manuel', 'Pablo', 'Marcos')

y para Cliente esta expresion: Match(Cliente,'Juan', 'Victor', 'Manuel', 'Pablo', 'Marcos')

muestra.png

Para saber si hay un descuadre, hice esto.

un gráfico  "tabla pivote" con dos dimensiones calculadas.

la primera, "Unión 1" es =if(GroupMask = 1, Compañia, if(GroupMask = 2,Cliente))

la segunda, "Unión2" es =if(GroupMask = 1, Cliente, if(GroupMask = 2, Compañia))

un expresión con =Sum(Saldos)

mi problema es que no he encontrado la forma de ordenar el gráfico "Descuadre" de forma especifica.

no se como decirla al "Sort Expresion" de Union1 o Union2, que lo ordene Juan, Victor, Manuel, Pablo, Marcos.

Actualmente en mi Qlikview original de 40 empresas las compañías son leídas en el script de forma ordenada,

ademas las compañías y los clientes tienen un numero de ordenamiento en el script, pero incluso usando eso para ordenarlo, a sido en vano.

¿Me ayudarían a encontrar una manera de ordenar una dimensión calculado de un gráfico pivote?

_______________________________________________________________________________________________________________

Lo he solucionado por ahora de esta manera, pero esto no es "optimo" para mi, teniendo en cuenta que tengo 46 empresas.

para el ejemplo lo soluciona por ahora así.

si alguien tiene una mejor idea, se lo agradecería mucho.

teniendo en cuenta la función RowNo() y como genera un auto numérico para cada linea se me ocurrió moverlas de esta manera. para la dimension calculada

"Union1" : =if(RowNo()=1,1,if(RowNo() =2, 4, if(RowNo() = 3,3, if(RowNo()=4,5,if(RowNo() = 5,2)))))

y en

"Union2" : =if(RowNo()=1,2,if(RowNo() =2, 5, if(RowNo() = 3,3, if(RowNo()=4,1,if(RowNo() = 5,4)))))

muestra2.png

13 Replies
othniel2014
Contributor III
Contributor III
Author

Jajajajaj, El Qlikview nos pierde muchas veces.

una de las ideas que me ha pasado por la mente es esa.

lo inconveniente de eso es que como son 46 empresas. al armarlo desde el script, demora una eternidad la carga.

si lo hago de esa manera, la carga del script me toma casi lo 25 minutos. por la cantidad de data que tiene que recalcular desde el script.

si lo hago en el grafico, por ahora me toma 8 minutos la carga. y ya los 8 minutos me parece una eternidad.

pero lo mas optimo para mi seria hacer lo que me pides.

en el ejemplo que puse, dentro del grafico "Descuadre" puse esto en la pestaña "Ordenar" y la parte que dice expresion.

"Union1" : =if(RowNo()=1,1,if(RowNo() =2, 4, if(RowNo() = 3,3, if(RowNo()=4,5,if(RowNo() = 5,2)))))

y en

"Union2" : =if(RowNo()=1,2,if(RowNo() =2, 5, if(RowNo() = 3,3, if(RowNo()=4,1,if(RowNo() = 5,4)))))

esto soluciona mi  problema.

el punto es que si se agregan mas empresas de las 46 que tengo, tendre que reparar este codigo cada vez que recargue.

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

No. no, no 

La tabla de mapping pones

Union1:

Mapping

LOAD INLINE

Juan, 1

Pedro, 2

Manolo, 3

Alberto, 4

Union2

Mapping

LOAD INLINE

Juan, 4

Pedro, 1

Manolo, 2

Alberto, 3

y en la tabla de hechos

LOAD *,

          Applymap('Union1', Unión1) as OrdUnion1

          Applymap('Union2', Unión2) as OrdUnion2         

LOAD ...

          if(GroupMask = 1, Compañia, if(GroupMask = 2,Cliente)) as Unión1

          if(GroupMask = 2, Cliente, if(GroupMask = 2,Compañia)) as Unión2

He corrido mucho disculpa si la sintaxis no es 100% correcta

Saludos

Joaquín

othniel2014
Contributor III
Contributor III
Author

Finalmente halle la solución, y fue gracias a ambos. en realidad fue gracias a los dos,

por que la solución correcta es una mezcla de las soluciones de ustedes.

Utilice un Dual con un ApplyMap al mismo tiempo, jajajajaja que locura.

Dual1:

Mapping

LOAD Orden1, dual(string,numrep) as Compañia INLINE [

    string, numrep, Orden1

    Juan, 1, 1

    Victor, 2, 2

    Manuel, 3, 3

    Pablo, 4, 4

    Marcos, 5, 5

];

Dual2:

Mapping

LOAD Orden2, dual(string,numrep) as Cliente INLINE [

    string, numrep, Orden2

    Juan, 1, 1

    Victor, 2, 2

    Manuel, 3, 3

    Pablo, 4, 4

    Marcos, 5, 5

];

y luego cambie la tabla de los datos de esta manera.

Tabla:

LOAD

ApplyMap('Dual1',Orden1,Null())as Compañia, ApplyMap('Dual2',Orden2,Null())as Cliente, GroupMask, Saldo

INLINE [

    Orden1, Orden2, GroupMask, Saldo

    1, 2, 1, 50

    1, 5, 1, 33.5

    1, 3, 1, 12

    1, 4, 2, -42

    3, 4, 1, 11

    3, 1, 2, -12

    5, 4, 1, 24

    5, 1, 2, -30

    5, 2, 2, -40

    4, 1, 1, 42

    4, 5, 2, -23

    4, 3, 2, -11

    2, 5, 1, 40

    2, 1, 2, -50

];

y listo, deje todo los gráficos iguales, y en la pestaña orden, le puse, ordenar numéricamente.

Esta es la solución para ordenar una dimension calculada dentro de una tabla pivote.

Usar la funcion Dual al mismo tiempo que el ApplyMap.

obviamente me toca cambiar mi query final, en vez de usar el nombre de la compañia, uso el numero id de la misma.

y acomodo el mapping.

Gracias por la ayuda. JoaquinLRSorrakis01

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Bueno, lo importante es que lo has resuelto.

Hasta la próxima