Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
jftalmeida
Partner - Contributor III
Partner - Contributor III

Calcular Quantidade de Registros na Tabela na Maior Dimensão

Boa tarde,

Tenho a seguinte dimensão com os possíveis valores abaixo:

Faixa de Valor

0 até 100

100,01 até 200

200,01 até 300

300,01 Até 9999999

Eu tenho vários títulos de um determinado cliente que possuem valores diferentes, portanto estão em faixas de valores diferentes, porém a conta deve ser feita considerando o título de maior valor, ou seja, o maior valor do cliente.

Fazendo um exercício simples com a fonte de dados, demonstrando:

Cliente | Título | Valor | Faixa de Valor

Joao | X01 | 150 | 100,01 até 200

Joao | X02 | 250 |  200,01 até 300

Maria | X03 | 100 | 0 até 100

Cássia | X04 | 290 | 200,01 até 300

Roberto | X05 | 330 | 300,01 Até 9999999

O gráfico em tabelas deve mostrar da seguinte forma:

Faixa de Valor | Quantidade de Clientes

0 até 100 - 1  (Título da Maria, X03)

100,01 até 200 - 0

200,01 até 300 - 2 (Título do João, X02 e o Título da Cássia, X04)

300,01 Até 9999999 - 1 (Título do Roberto, X05)

Totalizando efetivamente 4 clientes da lista.

Eu usei AGGR para buscar o valor máximo, agrupado por cliente... consigo encontrar, porém na hora de encaixar no gráfico ele sempre calcula 1 em todas as dimensões de faixa de valor que o cliente tiver título.

Exemplo: COUNT(AGGR(MAX(Valor), Cliente, Faixa de Valor))

1 Solution

Accepted Solutions
jftalmeida
Partner - Contributor III
Partner - Contributor III
Author

Apenas retornando que eu consegui fazer a expressão aqui, faltava utilizar a cláusula TOTAL dentro da expressão, ficando da seguinte forma:

Exemplo: COUNT( DISTINCT IF( AGGR(MAX( Value1 ), Customer , [Value range] ) = AGGR(MAX({<[Value range]=>} TOTAL<Customer > Value1 ), Customer , [Value range] ), Customer , NULL())



Mesmo assim agradeço pela tentativa de apoio.

View solution in original post

6 Replies
vishsaggi
Champion III
Champion III

One of doing this is like

RangeVal:

LOAD *, Subfield(ValRange, '|',1) AS Val1,

        Subfield(ValRange, '|',2) AS Val2;

LOAD *, Replace(Replace([Value range], 'Up to','|'), 'to', '|') AS ValRange INLINE [

Customer | Title | Value1 | Value range

Joao | X01 | 150 | 100.01 to 200

Joao | X02 | 250 | 200.01 to 300

Maria | X03 | 100 | 0 to 100

Cássia | X04 | 290 | 200.01 to 300

Roberto | X05 | 330 | 300.01 Up to 9999999

] (delimiter is '|');

LEFT JOIN(RangeVal)

RangeVal1:

LOAD Customer,

    

     Max(Value1) AS MaxVal

Resident RangeVal

Group By Customer;

Then using your Straight table chart Add

dim: [Value range]

Expr: = Sum(IF(MaxVal >= Val1 AND MaxVal <= Val2, 1, 0)) & ' [' & Concat(Customer & '|' & Title, ',') & ']'

Capture.PNG

vishsaggi
Champion III
Champion III

Or in the script try below:

RangeVal:

LOAD *, Subfield(ValRange, '|',1) AS Val1,

        Subfield(ValRange, '|',2) AS Val2;

LOAD *, Replace(Replace([Value range], 'Up to','|'), 'to', '|') AS ValRange INLINE [

Customer | Title | Value1 | Value range

Joao | X01 | 150 | 100.01 to 200

Joao | X02 | 250 | 200.01 to 300

Maria | X03 | 100 | 0 to 100

Cássia | X04 | 290 | 200.01 to 300

Roberto | X05 | 330 | 300.01 Up to 9999999

] (delimiter is '|');

LEFT JOIN(RangeVal)

RangeVal1:

LOAD Customer,

    

     Max(Value1) AS MaxVal

Resident RangeVal

Group By Customer;

LEFT JOIN(RangeVal)

FinalRangeVal:

LOAD [Value range],

     Sum(IF(MaxVal >= Val1 AND MaxVal <= Val2, 1, 0)) AS NoOfClients

Resident RangeVal

Group By [Value range];

jftalmeida
Partner - Contributor III
Partner - Contributor III
Author

Não é possível fazer dessa forma. Porque o cálculo deve ser dinâmico de acordo com as seleções realizadas pelo usuário.

O que eu quero dizer é que o group by proposto no script não faz sentido nesse caso, pois o agrupamento limitará sempre a uma data fixa do cliente.

Estou tentando fazer via agregação e um IF na agregação, estou quase chegando lá, algo como se fosse assim:

COUNT(DISTINCT IF(AGGR(MAX( Value1 ), Customer , [Value range] ) = Value1,Customer))

vishsaggi
Champion III
Champion III

Share a sample you are working on and show us what you achieved till now and what you are expecting?

jftalmeida
Partner - Contributor III
Partner - Contributor III
Author

Vou tentar perguntar de forma objetiva:

Como fazer comparação utilizando 2 sintaxes AGGR na expressão e em uma delas desconsiderar a dimensão utilizada na tabela? Ou seja, nesse exemplo preciso desconsiderar a Faixa de Valor em uma expressão AGGR, para comparar Se o Maior Valor Agrupado por Faixa de Valor/Cliente é igual ao Maior Valor do Cliente, se esse predicado for verdadeiro então conta na expressão.

Exemplo: COUNT( DISTINCT IF( AGGR(MAX( Value1 ), Customer , [Value range] ) = AGGR(MAX({<[Value range]=>} Value1 ), Customer , [Value range] ), Customer , NULL())

Por fim, utilizando a base de dados exposta anteriormente, deve mostrar assim:

Faixa de Valor | Quantidade de Clientes | Quantidade de Títulos

0 até 100 - 1 - 1

100,01 até 200 - 0 - 1

200,01 até 300 - 2  - 2

300,01 Até 9999999 - 1  - 1

jftalmeida
Partner - Contributor III
Partner - Contributor III
Author

Apenas retornando que eu consegui fazer a expressão aqui, faltava utilizar a cláusula TOTAL dentro da expressão, ficando da seguinte forma:

Exemplo: COUNT( DISTINCT IF( AGGR(MAX( Value1 ), Customer , [Value range] ) = AGGR(MAX({<[Value range]=>} TOTAL<Customer > Value1 ), Customer , [Value range] ), Customer , NULL())



Mesmo assim agradeço pela tentativa de apoio.