Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1351 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL/SQL Server] Croisé dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL/SQL Server] Croisé dynamique

n°235771
thegti
La constipation se soigne ...
Posté le 28-10-2002 à 10:51:32  profilanswer
 

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
mood
Publicité
Posté le 28-10-2002 à 10:51:32  profilanswer
 

n°237114
thegti
La constipation se soigne ...
Posté le 30-10-2002 à 10:38:54  profilanswer
 

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

n°237166
irulan
Posté le 30-10-2002 à 11:37:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL/SQL Server] Croisé dynamique

 

Sujets relatifs
Extraire l'heure et les minutes d'une table Time SQL (10:30:00)SQL SERVER et la fonction TRIM
Aide sur une Requete SQLPHP FORMULAIRE SQL ORACLE
Problème avec une requête SQL[SQL SERVER] Un petite question !
XML -> SQL en PHPSelect d'SQL...
Plus de sujets relatifs à : [SQL/SQL Server] Croisé dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR