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

1 Solution

Accepted Solutions
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

View solution in original post

13 Replies
sorrakis01
Specialist
Specialist

Hola,

De momento se me ocurre... podrías probar con la función Dual()

Saludos,

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola othniel2014:

La ordenación 'a pelo' es relativamente sencilla:

Creas una tabla inline con dos campos Nombre y OrdenAlternativo

Después haces un join o un applymap a las tablas de hechos para añadir ese campo (ojo el nombre por las sinéticas)

Por último, introduces ese campo en ordenar/expresion

Saludos

Joaquín

othniel2014
Contributor III
Contributor III
Author

Gracias amigo, pero ya he usado el ApplyMap y el Mapping, y no funciono...

recuerda que utilizo una "Dimension Calculada" (estoy uniendo el campo de Compañia y el de Cliente). si te parece, intenta hacer el qlikview de ejemplo que puse, este es el script, muchas gracias por tu apoyo.

Tabla:

LOAD * INLINE [

    Compañia, Cliente, GroupMask, Saldo

    Juan, Victor, 1, 50

    Juan, Marcos, 1, 33.5

    Juan, Manuel, 1, 12

    Juan, Pablo, 2, -42

    Manuel, Pablo, 1, 11

    Manuel, Juan, 2, -12

    Marcos, Pablo, 1, 24

    Marcos, Juan, 2, -30

    Marcos, Victor, 2, -40

    Pablo, Juan, 1, 42

    Pablo, Marcos, 2, -23

    Pablo, Manuel, 2, -11

    Victor, Marcos, 1, 40

    Victor, Juan, 2, -50

];

y este es el grafico que quiero armar:

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)

othniel2014
Contributor III
Contributor III
Author

Ya lo pruebo y edito.

sorrakis01
Specialist
Specialist

Hola,


Solo una duda... Le estas diciendo que no te muestre los valores a 0?

Se te reducirá un montón la tabla....

sorrakis01
Specialist
Specialist

Hola,

he estado probando con Dual y no me ha ido bien, lo que si me ha funcionado es si ordenas las 2 por Texto.

Saludos,

othniel2014
Contributor III
Contributor III
Author

ok, les digo los que estoy haciendo..

uno de los clientes de mi jefe usa el sistema SAP y estoy armando los estados financieros en el qlikview,

y me pidieron que mostrara las cuentas por cobrar de cada compañia por cliente a su vez

las cuentas por pagar de cada cliente por compañia, si notas este es el contrario del anterior.

en el ejemplo que puse, la primera imagen, en el grafico "Cuentas por cobrar" Juan bajo la columna "Compañia" tiene una cuenta por cobrar de 50.00  a Victor, osea que Victor le debe a Juan

en el grafico de "Cuentas por pagar" como esta alrevez. puedo encontrar al cliente Juan dentro de la empresa Victor,

y fijarme si dentro de la BD de Victor tambien esta el monto de -50.00 en este caso. osea que aparece que en concreto, Victor le debe a Juan los 50.00

ok, para saber si todas las base de datos estan consolidadas, me mandaron hacer el grafico de "Descuadre",  uniendo las cuentas por cobrar y las cuentas por pagar, por eso muestro los campos que dicen "0.00" para que el cliente de mi jefe vea que empresas estan cuadradas, y cuales no.

para un mejor analisis, grafico de "Descuadre" debe estar ordenado como sus predecesores.

el punto es que como las dimenciones que uso en el grafico de "Descuadre" son dimenciones calculadas, no puedo ordenarlo.

ahorita  probe el DUAL, pero me convierte el texto en un campo numerico. pero si me las ordeno, al menos dentro del Cuadro de tabla.

Sin título.png

othniel2014
Contributor III
Contributor III
Author

se me ocurrio intentar convertir el texto en un campo numerico, jajajajaj aunque no se si dentro de los limites de Qlikview podre hacerlo.

el problema con Dual es que le da al campo una connotacion numerica, y no hace el match con el campo texto.

aunque visualmente sean el mismo.

los ejemplos que vi del DUAL eran fechas, y sabemos que aunque veamos febrero, lunes, por detras siguen siendo numeros, pero bueno al parecer es un poco complicado usarlo con valores cuya connotacion es texto.

Edito.

Ellos ya tienen un orden especifico para las 46 empresas que me dieron a manejar. y tengo entendido que lo hacen asi por temas contables, de quien le debe mas , o de donde sale la plata que le prestan a las otras.. por que originalmente las tenia ordenada yo por orden de texto.

pero entre los cambios que debía hacer esta el orden de las empresas...

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola:

Estoy perdido, pero a lo mejor me encuentro

Crea campos en el script

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

Y luego creas dos campos con el ApplyMap OrdUnión1 y OrdUnión2

En la fórmula de ordenación pones esto

if(GroupMask = 1, OrdUnión1, OrdUnión2)


Saludos

Joaquín