Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour j'ai un datawarehouse relatif à la gestion des ventes de prestations d'un club à ces membres et une application Qlikview de tableaux de bord et de suivi d'activité de ce club.
Dans Qlikview, le schéma de table est le suivant :
Je souhaite faire un graphique comparatif du nombre de nouveaux membres et des objectifs de nouveaux membres mensuels.
Dans un premier temps, j'ai utilisé l'expression suivante :
Count({$<Année={$(=Max(Année))}>} DISTINCT DATE_ENTREE)
mais cela donne le nombre de membres qui achètent des prestations chaque mois (Logique puisque le lien se fait avec la table des faits de Vente).
Dans un second temps, j'ai décomposé le champ DATE_ENTREE (Format "AAAA-MM-JJ") de la dimension Membre en plusieurs champs:
- Année (Format "AAAA")
- Mois (Format "MM")
- AnnéeMois (Format "AAAA-MM").
Qlikview a alors détecté une boucle entre les tables dimension Membre et Date et la table des Objectifs sur le champ AnnéeMois, puis a décidé de déconnecter la table dimension Date pour "casser" la boucle ! J'avais alors le nombre de nouveaux membres chaque mois mais plus de liens avec la table dimension Date, donc plus de données exploitable pour les autres graphiques !
Ma question est la suivante : quelle est la meilleure option pour calculer le nombre de nouveaux membres chaque mois et le comparer aux objectifs fixés ? (Script et/ou expression)
Merci pour vos réponses.
Cordialement.
Eric
Bonjour,
Je penses que l'idée était bonne de créer les nouveaux champs dans la table membre. Mais il faut les nommer différemment :
Month(DATE_ENTREE) as MoisEntree,
Year(DATE_ENTREE) as AnnéeEntree, ....
En changeant les noms il n'y aura pas de boucle.
Si tu veux avoir un seul calendrier, il faudrait essayer de créer une table de faits.
Bonjour,
j'ai résolu le problème en utilisant la technique de la table creuse : je disposait d'une table de faits de Vente, d'une table d'agrégats de vente et une table des objectifs de vente. Ces deux dernières tables avaient des clés qui étaient des sous-ensembles de la clé de la table des faits de vente. J'ai donc regroupé toutes ces informations dans la table des faits de vente, en renseignant les clés relatives aux informations stockées.
Pour ce qui est du nombre de nouveaux membres, je n'ai pas eu à décomposer la donnée DATE_ENTREE de la dimension Membre en Année et Mois d'entrée.
En le faisant, j'avais l'information des Années et Mois d'entrée dans la dimension Membre et une dimension Calendrier qui contenait toutes les informations relatives aux dates, mais pas de possibilité de gérer ces deux "dates" dans un même graphique pour comparer le nombre de nouveaux membres chaque mois aux objectifs fixés.
J'ai alors aussi utilisé la technique de la table creuse : le nombre de nouveaux membres étant une mesure, comme un agrégat, j'ai inséré cette donnée calculée dans la table des faits de vente, ce qui ne me semblait pas évident au début car je ne connaissais pas les possibilités du langage script !
Cela donne donc une table des faits de vente suivante :
avec le script suivant :
Vente:
LOAD `CLE_VENTE`,
null() as CLE_AGR_VENTE,
`CLE_DATE`,
`CLE_MEMBRE`,
`CLE_ZONE`,
`CLE_PRESTATION`,
`CLE_CATEGORIE`,
`V_QUANTITE_VENTES` as Quantité,
`V_MONTANT_VENTES` as Montant,
null() as AgrégatQuantité,
null() as AgrégatMontant,
null() as NouveauxMembre,
null() as ObjectifMembre,
null() as ObjectifVente,
null() as ObjectifMontant;
SQL SELECT *
FROM datawarehouse.vente;
// Chargement des objectifs de ventes
LOAD null() as CLE_VENTE,
null() as CLE_AGR_VENTE,
CLE_DATE,
null() as CLE_MEMBRE,
null() as CLE_ZONE,
null() as CLE_PRESTATION,
null() as CLE_CATEGORIE,
null() as Quantité,
null() as Montant,
null() as AgrégatQuantité,
null() as AgrégatMontant,
null() as NouveauxMembre,
OBJ_MEMBRE as ObjectifMembre,
OBJ_VENTE as ObjectifVente,
OBJ_MONTANT as ObjectifMontant
FROM
(
// Chargement des agrégats de vente
LOAD null() as CLE_VENTE,
`CLE_AGR_VENTE`,
`CLE_DATE`,
null() as CLE_MEMBRE,
`CLE_ZONE`,
null() as `CLE_PRESTATION`,
`CLE_CATEGORIE`,
null() as Quantité,
null() as Montant,
`A_QUANTITE_VENTES` as AgrégatQuantité,
`A_MONTANT_VENTES` as AgrégatMontant,
null() as NouveauxMembre,
null() as ObjectifMembre,
null() as ObjectifVente,
null() as ObjectifMontant;
SQL SELECT *
FROM datawarehouse.`agregat_vente`;
// Chargement du nombre de nouveaux membres chaque mois
LOAD null() as CLE_VENTE,
null() as CLE_AGR_VENTE,
`CLE_DATE`,
null() as CLE_MEMBRE,
null() as CLE_ZONE,
null() as `CLE_PRESTATION`,
null() as CLE_CATEGORIE,
null() as Quantité,
null() as Montant,
null() as AgrégatQuantité,
null() as AgrégatMontant,
NouveauxMembre,
null() as ObjectifMembre,
null() as ObjectifVente,
null() as ObjectifMontant;
SQL SELECT CLE_DATE, COUNT(*) as NouveauxMembre
FROM datawarehouse.`membre` , datawarehouse.`date`
WHERE REF_ANNEE = SUBSTRING(DATE_ENTREE FROM 1 FOR 4)
AND REF_MOIS = SUBSTRING(DATE_ENTREE FROM 6 FOR 2)
AND REF_DATE IS NULL
GROUP BY SUBSTRING(DATE_ENTREE FROM 1 FOR 7);
Le problème est donc résolu.
Cordialement.
Eric
Très bien,
Pour information (sauf si c'est ton choix) il est possible d'utiliser l'instruction Concatenate pour forcer la concatenation :
Par exemple pour la dernière table :
Concatenate(Vente)
LOAD
`CLE_DATE`,
NouveauxMembr;
SQL SELECT CLE_DATE, COUNT(*) as NouveauxMembre
FROM datawarehouse.`membre` , datawarehouse.`date`
WHERE REF_ANNEE = SUBSTRING(DATE_ENTREE FROM 1 FOR 4)
AND REF_MOIS = SUBSTRING(DATE_ENTREE FROM 6 FOR 2)
AND REF_DATE IS NULL
GROUP BY SUBSTRING(DATE_ENTREE FROM 1 FOR 7);
Ca évite de préciser tous les champs à NULL. Et du coup, c'est bien plus propre.