J'ai pu utiliser la solution de Paco Zarate et cela fonctionne à merveille. J'ai dû ajouter une ligne ("SET ANSI_WARNINGS ON"), mais c'est peut-être dû à la façon dont je l'ai utilisée ou appelée. Il y a un problème avec mon utilisation et j'espère que quelqu'un pourra m'aider à le résoudre :
La solution ne fonctionne qu'avec une table SQL réelle. J'ai essayé avec une table temporaire et aussi une table en mémoire (déclarée), mais cela ne fonctionne pas. Dans mon code d'appel, je crée donc une table dans ma base de données SQL, puis j'appelle SQLTranspose. Là encore, cela fonctionne parfaitement. C'est exactement ce que je veux. Voici mon problème :
Pour que la solution globale soit réellement dynamique, je dois créer cette table où je stocke temporairement les informations préparées que j'envoie à SQLTranspose "à la volée", puis supprimer cette table une fois que SQLTranspose est appelé. La suppression de la table pose un problème dans mon plan de mise en œuvre final. Le code doit être exécuté à partir d'une application d'utilisateur final (un bouton sur un formulaire/menu Microsoft Access). Lorsque j'utilise ce processus SQL (créer une table SQL, appeler SQLTranspose, supprimer la table SQL), l'application de l'utilisateur final rencontre une erreur parce que le compte SQL utilisé n'a pas les droits nécessaires pour supprimer une table.
Je pense donc qu'il y a plusieurs solutions possibles :
-
Trouvez un moyen de faire fonctionner SQLTranspose avec une table temporaire ou une variable de table déclarée.
-
Trouvez une autre méthode pour la transposition des lignes et des colonnes qui ne nécessite pas une table SQL réelle.
-
Trouver une méthode appropriée pour permettre au compte SQL utilisé par mes utilisateurs finaux de supprimer une table. Il s'agit d'un seul compte SQL partagé codé dans mon application Access. Il semble que cette autorisation soit un privilège de type dbo- qui ne peut être accordé.
Je reconnais que certaines de ces questions peuvent justifier un autre fil de discussion et une autre question. Cependant, comme il est possible qu'une solution soit simplement une façon différente de transposer les lignes et les colonnes, je vais faire mon premier message ici dans ce fil.
EDIT : J'ai aussi remplacé sum(value) par max(value) dans la 6ème ligne à partir de la fin, comme Paco l'a suggéré.
EDIT :
J'ai trouvé quelque chose qui marche pour moi. Je ne sais pas si c'est le meilleur réponse ou non.
J'ai un compte d'utilisateur en lecture seule qui est utilisé pour exécuter des procédures strored et donc générer des rapports à partir d'une base de données. Étant donné que la fonction SQLTranspose que j'ai créée ne fonctionne qu'avec une table "légitime" (pas une table déclarée ni une table temporaire), j'ai dû trouver un moyen pour qu'un compte utilisateur en lecture seule puisse créer (puis supprimer) une table.
Je me suis dit que pour mes besoins, il n'y avait pas de problème à ce que le compte utilisateur soit autorisé à créer une table. Cependant, l'utilisateur ne pouvait toujours pas supprimer la table. Ma solution a été de créer un schéma où le compte utilisateur est autorisé. Ensuite, chaque fois que je crée, utilise ou supprime cette table, je la réfère au schéma spécifié.
J'ai d'abord lancé cette commande depuis un compte 'sa' ou 'sysadmin' : CREATE SCHEMA ro AUTHORIZATION
Chaque fois que je fais référence à ma table "tmpoutput", je la spécifie comme cet exemple :
drop table ro.tmpoutput