Croisé dynamique [SQL/SQL Server] - SQL/NoSQL - Programmation
Marsh Posté le 30-10-2002 à 11:37:18
Je pense qu'l va être difficile de trouver plus simple, parce que ce que tu veux consiste à transformer des faits en dimensions.
Le plus simple est d'utiliser Access ou un requêteur du marché afin de pouvoir travailler en local sur ton set de résultats.
Sinon une autre solution est de créer une table temporaire qui présente la structure correspondant à ton besoin (en gros table TEMP, avec les champs PERSONNES, MONTANT_TYPE0, MONTANT_TYPE1, MONTANT_TYPE2, que tu remplis avec un insert judicieusement rédigé voire une procédure stockée). Mais bon je ne suis pas sûr que ce soit plus simple que ta solution
Marsh Posté le 28-10-2002 à 10:51:32
J'ai une table MONTANT:
Personne | TypeDeMontant | Montant
----------------------------------
toto | 0 | 50
toto | 1 | 100
mimi | 0 | 20
mimi | 2 | 30
Je cherche à avoir un résultat:
Personne | MontantDeType0 | MontantDeType1 | MontantDeType2
-----------------------------------------------------------
toto | 50 | 100 | 0
mimi | 20 | 0 | 30
Sous Access, ca se fait tout seul avec une requête croisée dynamique, mais sous SQL Server 7, j'ai rien trouvé
Bien sur, y'a la solution utiliser 3 occurences de la table, mais niveau performance, ca va pas le faire.
J'ai néanmoins envisager une solution intermédiaire intéréssante qui consiste à créer une table TYPEMONTANT:
TypeDeMontant | Facteur
-------------------------
0 | 1
1 | 1
2 | 1
Une solution est alors:
SELECT PERSONNE,
SUM(ISNULL(T1.Facteur,0)*M.Montant),
SUM(ISNULL(T2.Facteur,0)*M.Montant),
SUM(ISNULL(T3.Facteur,0)*M.Montant)
FROM MONTANT M, TYPEMONTANT T1, TYPEMONTANT T2, TYPEMONTANT T3
WHERE M.TypeDeMontant*=T1.TypeDeMontant
AND T1.TypeDeMontant=0
AND M.TypeDeMontant*=T2.TypeDeMontant
AND T2.TypeDeMontant=1
AND M.TypeDeMontant*=T3.TypeDeMontant
AND T3.TypeDeMontant=2
GROUP BY PERSONNE
Ca marche, c'est beaucoup moins lourd que la solution bourrin avec 3 occurences de la table MONTANT, mais ca complique beaucoup le code
Auriez vous une meilleure solution ?
Merci d'avance
Message édité par thegti le 28-10-2002 à 10:52:34