Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour! Je suis sur Qlik Sense et j'ai quelques difficultés à effectuer une transformation au niveau de mes données, j'aimerais pouvoir dupliquer une ligne en autant de ligne qu'il y a de champs dans ID_WEEK (chaque champ est séparé par un point virgule), un exemple simple:
START_DATE | END_DATE | ID_WEEK
14/03/2011 | 16/03/2011 | M105587L25725
14/03/2011 | 30/03/2011 | M100337L41098;M105579L25724;M104310L30703;
START_DATE | END_DATE | NB_WEEKS | ID_WEEK
14/03/2011 | 16/03/2011 | M105587L25725
14/03/2011 | 30/03/2011 | M100337L41098
14/03/2011 | 30/03/2011 | M105579L25724
14/03/2011 | 30/03/2011 | M104310L30703
Avez-vous une idée? D'avance merci.
Bonjour,
Essai avec la fonction SubField:
Référence: https://community.qlik.com/message/102200#102200
NewTable:
NoConcatenate
LOAD
START_DATE
,END_DATE
,FLOOR((END_DATE - START_DATE) / 7) AS NB_WEEKS
, SubField(ID_WEEK, ';') AS ID_WEEK
RESIDENT Data;
SubField - script and chart function:
Si vous utilisez la fonction Subfield () dans une instruction LOAD avec le paramètre facultatif field_no omis, un enregistrement complet sera généré pour chaque sous-chaîne. Si plusieurs champs sont chargés à l'aide de Subfield (), les produits cartésiens de toutes les combinaisons sont créés.
S.v.p. marquer les réponses comme correctes ou utiles (https://community.qlik.com/docs/DOC-14806)
Bonjour,
Il y a sans doute plus simple mais voici une solution qui fonctionne :
Data:
Load * inline
[
START_DATE,END_DATE,ID_WEEK
14/03/2011,16/03/2011,M105587L25725
14/03/2011,30/03/2011,M100337L41098;M105579L25724;M104310L30703;
];
Table:
NoConcatenate
LOAD *,
len(ID_WEEK)-len(PurgeChar(ID_WEEK,';')) as NB_SEPARATEUR
Resident Data;
DROP Table Data;
TableTemp:
NoConcatenate
LOAD *
Resident Table
Order By NB_SEPARATEUR;
LET vMax = Num(peek('NB_SEPARATEUR',-1,'TableTemp'));
DROP Table Table;
// Traitement des enregistrements sans séparateur
Table:
NoConcatenate
LOAD START_DATE,
END_DATE,
ID_WEEK
Resident TableTemp
Where NB_SEPARATEUR = 0;
FOR a=1 to $(vMax)
Table:
Concatenate
LOAD START_DATE,
END_DATE,
Mid(ID_WEEK,1,Index(ID_WEEK,';')-1) as ID_WEEK
Resident TableTemp
Where NB_SEPARATEUR > 0
and $(a)=1;
Table:
Concatenate
LOAD START_DATE,
END_DATE,
Mid(ID_WEEK,Index(ID_WEEK,';',($(a)-1))+1,(Index(ID_WEEK,';',$(a)-1)-1)) as ID_WEEK
Resident TableTemp
Where NB_SEPARATEUR > 0
and $(a)>1
and NB_SEPARATEUR > $(a);
Table:
Concatenate
LOAD START_DATE,
END_DATE,
PurgeChar(Mid(ID_WEEK,Index(ID_WEEK,';',$(a)-1)+1),';') as ID_WEEK
Resident TableTemp
Where NB_SEPARATEUR = $(a);
NEXT
TableFinale:
NoConcatenate
LOAD *
Resident Table
where ID_WEEK <> '';
DROP Table TableTemp;
DROP Table Table;
Bonjour,
Essai avec la fonction SubField:
Référence: https://community.qlik.com/message/102200#102200
NewTable:
NoConcatenate
LOAD
START_DATE
,END_DATE
,FLOOR((END_DATE - START_DATE) / 7) AS NB_WEEKS
, SubField(ID_WEEK, ';') AS ID_WEEK
RESIDENT Data;
SubField - script and chart function:
Si vous utilisez la fonction Subfield () dans une instruction LOAD avec le paramètre facultatif field_no omis, un enregistrement complet sera généré pour chaque sous-chaîne. Si plusieurs champs sont chargés à l'aide de Subfield (), les produits cartésiens de toutes les combinaisons sont créés.
S.v.p. marquer les réponses comme correctes ou utiles (https://community.qlik.com/docs/DOC-14806)
C'est vrai que c'est plus simple ainsi !
C'est exactement ce qu'il me fallait, merci à vous deux pour votre aide! Bel effort Laurent .