Skip to main content
Announcements
Global Transformation Awards! Applications are now open. Submit Entry
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Función "Not in" en QlikView

Hola,

He buscado bibliografía y discusiones de cómo aplicar la función Exists, pero no me ha funcionado y no he podido detectar cuál es mi error.  Tengo una base de datos donde dependiendo de lo contenido en una dimensión se ejecuta una acción, por ejemplo:

Si la dimensión Pais contiene países como Afganistan, Cuba, USA, entonces que ponga la palabra "Aprobado", sino, entonces que ponga la palabra "Pendiente".

¿Me podrían colaborar por favor?  Gracias!

1 Solution

Accepted Solutions
Not applicable
Author

Hola,

Realmente lo que hice fue una mezcla entre lo comentado por Joaquín, Juan y Alex y me dio el resultado.  Muchas gracias!

View solution in original post

11 Replies
mbernales
Contributor III
Contributor III

Hola Monica,

Puedes subir el código que estás usando para identificar si se encuentra ahí el error

y en lo posible un ejemplo de los datos en los cuales trabajas

Saludos

MB

jvitantonio
Luminary Alumni
Luminary Alumni

Hola Monica, no se si entendi bien pero su es lo que creo, la funcion exist no te sera de ayuda.

PAra hacer lo que necesitas, es cuestion de comprar el campo Pais con los paises que quieres que contenga. Por ejemplo:

MiTabla:

Load

if(match(Pais, 'US,'Afganistan', 'Cuba') > 0, 'Aprobado', 'Pendiente') AS CategoriaPais

FROM miArchivo.qvd (qvd);

Tambien puedes usar un Mapping Load. Esta funcion esta optimizada mejor cuando necesitas mapear muchos valores.

Por otro lado, la funcion "exists()" es utilizada para cargar solo valores de una tabla que ya han sido cargados previamente en otra tabla.

Ej:

a:

Load Client FROM miArchivo.qvd (qvd);

b:

Load Client, Venta FROM MiArchivo2.qvd (qvd)

WHERE EXISTS(Client);

En este caso, la tabla b, solo cagara las venta de clientes que se hayan cargado previamente en la tabla a.

Saludos

Juan

Not applicable
Author

Hola,  esto es lo que estoy haciendo:

PrefijoPais.cvs = Listado donde están todos los países del mundo con el número del prefijo y el número de caracteres después del prefijo que se requiere trabajar

Pais,CaracteresPrefijo,CaracteresConsecutivo

Afganistan,2,3

Africa,2,3

Algeria,3,3

...

Jamaica,4,3

Kenya,3,3

...

Venezuela,2,3

Zimbawe,3,6


Map_Prefijos:

Mapping

LOAD Pais,

CaracteresPrefijo

FROM

PrefijoPais.csv

(txt, codepage is 1252, embedded labels, delimiter is ',', msq);

//Trae el número de caracteres después del prefijo

Map_Prefijos_1:

Mapping

LOAD PaisDestino,

CaracteresConsecutivo

FROM

PrefijoPais.csv

(txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Trafico_Tmp:

LOAD Distinct

Lote,

Pais,

NumeroDestino,

left(NumeroDestino,ApplyMap('Map_Prefijos',Pais) ) as Prefijo,

ApplyMap('Map_Prefijos',Pais)  as Prefijo_Num,

mid(NumeroDestino,

ApplyMap('Map_Prefijos',Pais) + 1,  ApplyMap('Map_Prefijos_1',Pais)) as Caracter,

Year(Fecha) as Año

FROM

[..\..\..\Produccion\DataMining\Mineria\Qvd\Trafico_*_tra.qvd]

(qvd)

Where Year(Fecha) = '2016';

Trafico_Tmp_0:

LOAD Distinct

Lote,

Prefijo,

'('&Concat(Distinct Caracter,'|',Caracter)&').*,Adicionar'  as Exp_Reg_1

Resident Trafico_Tmp

Group by

Lote,

Prefijo;

DROP Table Trafico_Tmp;

Trafico:

NoConcatenate

LOAD Distinct

  subfield(Lote,'-',1)&';'&subfield(Lote,'-',2)&';'&subfield(Lote,'-',3)&',^'&Prefijo&'.*'&Concat(Distinct Exp_Reg_1,'|')  as Exp_Reg

Resident Trafico_Tmp_0

  Group by

  Lote,

  Prefijo;

DROP Table Trafico_Tmp_0;

Lo anterior lo aplicará para todos los países, pero requiero que para 5 países específicos no tome esta sentencia en "Trafico_Temp_0":

'('&Concat(Distinct Caracter,'|',Caracter)&').*,Adicionar'  as Exp_Reg_1

sino ésta:

', Adicionar' as Exp_Reg_1


Y además, que en "Trafico" para esos 5 países específicos la concatenación sea:

  subfield(Lote,'-',1)&';'&subfield(Lote,'-',2)&';'&subfield(Lote,'-',3)&',^'&Prefijo&'.*'&Exp_Reg_1)  as Exp_Reg

Para el resto de países sea:

  subfield(Lote,'-',1)&';'&subfield(Lote,'-',2)&';'&subfield(Lote,'-',3)&',^'&Prefijo&'.*'&Concat(Distinct Exp_Reg_1,'|')  as Exp_Reg


Mil gracias!

alex_millan
Creator III
Creator III

Hola,

tal y como te apuntaba Juan, yo también sugeriría utilizar la función match.

Por ejemplo en "Trafico_Temp_0":


If(

     Match(Pais, 'US,'Afganistan', 'Cuba') > 0,

     ', Adicionar',

     '('&Concat(Distinct Caracter,'|',Caracter)&').*,Adicionar'

)  as Exp_Reg_1

Recuerda:

Ten en cuenta que necesitas el campo Pais en la tabla origen de los datos si quieres evaluar el dato al cargarlo.

Por ejemplo, si quieres evaluar por país el campo Exp_Reg en la tabla Trafico, y los datos los cargas de la tabla Trafico_Tmp_0, tendrás que dejar el campo Pais en esa tabla, o crearte un flag para identificar los registros correspondientes a esos paises.

Un saludo

Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Hola Mónica:

Otra posiblidad es

Acciones:

Mapping

LOAD * INLINE [

          País, Acción

          Afganistán, Aprobado

          Cuba, Aprobado

...

];

Trafico:

LOAD ...

          ApplyMap('Acciones', Pais, 'Pendiente') as Acción

La tabla de mapeo la puedes cargar Inline o desde un origen externo, como te sea más práctico.

Saludos

Joaquín

Not applicable
Author

Hola,

Realmente lo que hice fue una mezcla entre lo comentado por Joaquín, Juan y Alex y me dio el resultado.  Muchas gracias!

Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Perfecto.

Mónica, marca tu respuesta como correcta para cerrar el hilo.

Saludos

Joaquín

Not applicable
Author

Hola Joaquín, no me sale la opción de "Respuesta Correcta"

Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Hola Mónica:

Tendrías que ver algo parecido a esto

Captura.JPG

Esto es un recorte de una conversación no cerrada

Saludos

Joaquñin