Expand my Community achievements bar.

SOLVED

Transposer des données

Avatar

Level 1

Bonjour à tous,

Je souhaiterais transposer des données

Exemple : j'ai 3 lignes de contrats actifs pour un client et je souhaiterais les afficher en colonne

Client 1 Contrat1 Libelle1

Client 1 Contrat2 Libelle2

Client 1 Contrat3 Libelle3

J'aimerais avoir le résultat suivant :

Client1 Contrat1 Contrat2 Contrat3 LibelléContrat1 LibelléContrat2 LibelléContrat3

Par avance,

Merci pour votre aide,

Rafika

1 Accepted Solution

Avatar

Correct answer by
Level 10

Bonjour Rafika,

La fonction Pivot n'est pas proposée en standard dans l'activité Requête d'un workflow (Sélection avancée).

Ceci dit, pour la transformation dont vous avez besoin, il me semble que cette méthode très simple, d'ajout de colonnes additionnelles d'entités liées peut vous convenir :

1276253_pastedImage_7.png

1276254_pastedImage_8.png

1276257_pastedImage_11.png

Puis sélectionner votre relation Contrat.


Dans mon instance, pas de contrat, je vous montre sur une entité équivalente :

1276258_pastedImage_12.png

Si vous ne limitez pas à 3 lignes, vous obtiendrez autant de colonnes contrat qu'il y a en base pour le client ayant le plus de contrat.

Poursuivez sur l'assistant jusqu'au dernier écran de paramétrage pour sélectionner les colonnes à ajouter :

1276259_pastedImage_13.png

Vous obtenez quelque chose comme ceci :

1276260_pastedImage_14.png

Dans Propriétés de votre workflow, pour tester (pas en production), cocher :

1276261_pastedImage_15.png

Ensuite, exécutez votre worklow et sur la flêche de transition, clic droit, Afficher la cible ; vous devriez obtenir un résultat similaire :

1276265_pastedImage_16.png

Le contexte targetData (temp:query si votre requête s'appelle query) est donc enrichi des colonnes additionnelles que vous souhaitez.
Ensuite il suffit d'utiliser les données de ce contexte comme vous le voulez dans votre diffusion ou bien les activités de traitement du reste de votre workflow.

Par exemple les mettre dans un tableau de votre diffusion dans l'ordre exact que vous souhaitez.

Si vous souhaitez plus loin, avec de "vraies" fonctions pivot, lisez la suite, sinon oubliez, cela va vous embrouillez...

Auparavant (en 6.0), il était possible de directement saisir une requête SQL native dans cette activité Requête (SQLData), mais pour des raisons de sécurité, la fonctionnalité SQLData a été supprimé à partir de la v6.1, et c'est tout à fait légitime.

Donc pour des requêtes qu'il n'est pas possible d'effectuer via l'assistant de l'activité Requête (car transformation sur plusieurs entités), il faut passer par une activité Javascript.

Il faut utiliser la méthode query de l'objet DDBEngine (cf la documentation JS API v6.1), ainsi vous avez toute la souplesse et les possibilités du moteur de votre base de données !
(A noter : DBengine.query n'est pas disponible dans une webApp, mais dans un workflow, c'est bon !)

Par exemple :

var cnx = application.getConnection()

try

{

  var stmt = cnx.query("SELECT Produit,
                      SUM([2003]) AS [2003],
                      SUM([2004]) AS [2004],
                      SUM([2005]) AS [2005],
                      SUM([2006]) AS [2006]
                      FROM  Ventes
                      PIVOT (SUM(Vente) FOR annee IN ([2003], [2004], [2005], [2006])) AS Annees
                      GROUP BY Produit
" )

}

catch(e)

{

  logWarning("query catched error (contrat data, transposition with pivot)");

  logWarning("Error number: " + e );

}

for each(var row in stmt)

   logInfo(row[0] + " : " + row[1] + " " + row[2] + " " + row[3] + " " + row[4])

cnx.dispose();

L'exemple donné est avec une syntaxe de requête SQL Sql Server.


Enfin, dernière solution à explorer, comme je vous le disais dans mon précédent post, les bibliothèques Javascript de gestion des pivot tables...  L'avantage est une gestion sans doute plus puissante en terme de formatage/présentation.

Cordialement.
Jean-Serge

View solution in original post

5 Replies

Avatar

Level 10

Bonjour Rafika,

Est-ce bien dans Adobe Campaign classic v6 ou un autre progiciel ?

Quel est votre moteur de base de données ?
Voulez-vous le faire en Javascript ou en SQL ?

Pour notre part, nous utilisons SQL Server pour Adobe Campaign et Oracle pour d'autres produits, et nous utilisons la fonction PIVOT de SQL Server (et son équivalent pour Oracle) pour transposer les données de colonne en ligne ou vice-versa.
Je ne sais pas si cela existe en mySql et Postgresql.

Et donc, comme vous pouvez à partir de Adobe Campaign v6, appeler des procédures stockées ou des fonctions de votre SGBD sous-jacent, vous pouvez obtenir le résultat escompté facilement depuis vos workflows ou vos webApp.

Il existe plusieurs implémentations de la fonction Pivot en Javascript, soit avec des fonctions open source ou d'éditeurs (je vous laisse le soin de regarder les résultats Google "pivot javascript"), mais je ne sais pas si elles fonctionnent bien au sein de code Javascript API Adobe Campaign.

Bon courage.
Cordialement.
Jean-Serge

Avatar

Level 1

Bonjour,

J'utilise Adobe Campaign V6

Ce n'est pas possible de le faire via les fonctions avancées proposées dans les boites activités dans un workflow ?

Par avance, merci pour votre aide,

A dispo,

Rafika

Avatar

Correct answer by
Level 10

Bonjour Rafika,

La fonction Pivot n'est pas proposée en standard dans l'activité Requête d'un workflow (Sélection avancée).

Ceci dit, pour la transformation dont vous avez besoin, il me semble que cette méthode très simple, d'ajout de colonnes additionnelles d'entités liées peut vous convenir :

1276253_pastedImage_7.png

1276254_pastedImage_8.png

1276257_pastedImage_11.png

Puis sélectionner votre relation Contrat.


Dans mon instance, pas de contrat, je vous montre sur une entité équivalente :

1276258_pastedImage_12.png

Si vous ne limitez pas à 3 lignes, vous obtiendrez autant de colonnes contrat qu'il y a en base pour le client ayant le plus de contrat.

Poursuivez sur l'assistant jusqu'au dernier écran de paramétrage pour sélectionner les colonnes à ajouter :

1276259_pastedImage_13.png

Vous obtenez quelque chose comme ceci :

1276260_pastedImage_14.png

Dans Propriétés de votre workflow, pour tester (pas en production), cocher :

1276261_pastedImage_15.png

Ensuite, exécutez votre worklow et sur la flêche de transition, clic droit, Afficher la cible ; vous devriez obtenir un résultat similaire :

1276265_pastedImage_16.png

Le contexte targetData (temp:query si votre requête s'appelle query) est donc enrichi des colonnes additionnelles que vous souhaitez.
Ensuite il suffit d'utiliser les données de ce contexte comme vous le voulez dans votre diffusion ou bien les activités de traitement du reste de votre workflow.

Par exemple les mettre dans un tableau de votre diffusion dans l'ordre exact que vous souhaitez.

Si vous souhaitez plus loin, avec de "vraies" fonctions pivot, lisez la suite, sinon oubliez, cela va vous embrouillez...

Auparavant (en 6.0), il était possible de directement saisir une requête SQL native dans cette activité Requête (SQLData), mais pour des raisons de sécurité, la fonctionnalité SQLData a été supprimé à partir de la v6.1, et c'est tout à fait légitime.

Donc pour des requêtes qu'il n'est pas possible d'effectuer via l'assistant de l'activité Requête (car transformation sur plusieurs entités), il faut passer par une activité Javascript.

Il faut utiliser la méthode query de l'objet DDBEngine (cf la documentation JS API v6.1), ainsi vous avez toute la souplesse et les possibilités du moteur de votre base de données !
(A noter : DBengine.query n'est pas disponible dans une webApp, mais dans un workflow, c'est bon !)

Par exemple :

var cnx = application.getConnection()

try

{

  var stmt = cnx.query("SELECT Produit,
                      SUM([2003]) AS [2003],
                      SUM([2004]) AS [2004],
                      SUM([2005]) AS [2005],
                      SUM([2006]) AS [2006]
                      FROM  Ventes
                      PIVOT (SUM(Vente) FOR annee IN ([2003], [2004], [2005], [2006])) AS Annees
                      GROUP BY Produit
" )

}

catch(e)

{

  logWarning("query catched error (contrat data, transposition with pivot)");

  logWarning("Error number: " + e );

}

for each(var row in stmt)

   logInfo(row[0] + " : " + row[1] + " " + row[2] + " " + row[3] + " " + row[4])

cnx.dispose();

L'exemple donné est avec une syntaxe de requête SQL Sql Server.


Enfin, dernière solution à explorer, comme je vous le disais dans mon précédent post, les bibliothèques Javascript de gestion des pivot tables...  L'avantage est une gestion sans doute plus puissante en terme de formatage/présentation.

Cordialement.
Jean-Serge

Avatar

Level 1

Merci

C'est exactement ce que je suis en train de tester.

Le nombre de lignes à conserver > je suis passée à 5 > et je teste le trie pour prioriser les lignes à séctionner

On va voir ..

Merci pour votre réactivité

Je reviens vers vous pour vous dire si le résultat me va,

A+

Rafika

Avatar

Level 1

Je suis absent(e) du bureau jusqu'au 21/08/2017

Pour toute urgence, contacter Michèle ou Rosario de l'équipe Ciblage

Bel été ++

Remarque : ceci est une réponse automatique à votre message "Reply marked

as helpful on Transposer des donnes" envoyé le 18/08/2017 13:40:09.

C'est la seule notification que vous recevrez pendant l'absence de cette

personne.