Conteggio distinct progressivo - Count distinct...progressive

| | Comments (3)
IT

Un caso d'uso particolare della funzione Count([distinct] expression), si ha quando vogliamo estendere il conteggio "a progressivo".

Ad esempio:
"quanti clienti ci sono in gennaio; quanti ce ne sono fino a febbraio; ... "

Purtroppo le funzioni di accumulo nelle chart sono disponibili solo per le sum()

Che fare ?

Quella che propongo è una soluzione brutale... a voi propormi qualcosa di più elegante

Supponiamo di avere questi dati:

Vendite:
load * inline [
mese, cliente
2, A
2, B
3, B
3, D
11,A
11,D
11,F];

io faccio così:

ConteggioClienti:
load distinct
 mese + iterNo() - 1 as mese
,cliente as _cliente
,1 as ctrCliente
resident Vendite 
while iterNo() <= 13-mese;

In pratica mi creo una tabella di appoggio, in cui per ogni mese colleziono tutti i diversi valori del codice da conteggiare, e la cifra 1 per contarli in modo più efficiente.
iterNo() mi serve per replicare i clienti su tutti i mesi, fino a fine anno.

il risultato è questo:

ProgressiveCountDistinct.gif


EN

There is a very specific use case, for the function: count([distinct] expression), when a "progressive" counting is requested.

For exemple:
"how many customer you have in gen, how many up to feb, etc... "

Unfortunately, for charts,  the "accumulate" options are avalable only when you use sum() aggregate functions..

How to do ?

I will sugget you a dirty solution...  I am sure you can give me a better one !

Let's have this data:

Sales:
load * inline [
month customer
2, A
2, B
3, B
3, D
11,A
11,D
11,F];

this is my suggestion:

CountingCustomers:
load distinct
 month + iterNo() - 1 as month
,customer as _customer
,1 as ctrCustomer
resident Sales 
while iterNo() <= 13-month;

Basically, I loaded a table with, for each month, the distinct codes to be counted.
I used the field ctrCustomer at 1, for best counting.
I used iterNo() to replicat customers code for every month, up to end of the year.

;-)

3 Comments

Vedo purtroppo che alla fine sei dovuto ricorrere allo script. Il mio documento gira su 40.000.000 di record con un'occupazione su file system di 500 mb che diventano 1 gb quando arriva in memoria. La tabella che andrei ad aggiungere per implementare il conteggio avrebbe un numero di record ben maggiore dei 40.000.000 già presenti.....

Comunque grazie per l'idea da utilizzare nel caso di documenti più snelli.

Ciao

P.S.: quando lavori con il conto economico, con le misure viste come dimensioni come fai a formattare diversamente elementi diversi? Es. tre decimali piuttosto che interi?

Propongo una soluzione che non usa lo script: usare come dimensione del grafico la dimensione calcolata valueloop(1, 12), e di conseguenza come espressioni count(distinct if(mese e concat(distinct if(mese .

Però attenzione, perché in verità a mio modesto parere a maggior ragione se le righe sono davvero tante, è preferibile ricorrere ad una soluzione che faccia uso di magari un po' più di ram (in verità non credo che la differenza sia così grande), ma espressioni nei grafici sensibilmente più semplici.
Altrimenti (posto di avere ram libera), il problema diventerebbe il tempo di calcolo del grafico!

E poi non è necessario fare tale "tabellina cumulata" per ogni anno-mese, ma è sufficiente per ogni mese, quindi diventerebbe di 1+2+3+..12 = 78 righe indipendentemente da quante righe abbia la tabella dei fatti (posto che il campo anno e il campo mese siano separati, invece di monthname() o simili).

Ultima nota: occhio che con QlikView 8.01 valueloop aveva un bug.

Hello

This is very funny . thank you for this. can i use this content in my website?

dizi izle


Regards rsssu

Leave a comment

Novità! Se vuoi essere contattato da un consulente Querit lascia nome e numero e Ti telefoneremo:





Pages