[SQL/SQL Server] Croisé dynamique

Croisé dynamique [SQL/SQL Server] - SQL/NoSQL - Programmation

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
Reply

Marsh Posté le 28-10-2002 à 10:51:32   

Reply

Marsh Posté le 30-10-2002 à 10:38:54    

[:phenstar] [:phenstar] [:phenstar]
Et 1... et 2... et 3-0 ! :D
[:phenstar] [:phenstar] [:phenstar]
 
(up déguisé)

Reply

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 :/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed