Regroupage tableau par mois et par année en SQL

Regroupage tableau par mois et par année en SQL - SQL/NoSQL - Programmation

Marsh Posté le 02-04-2014 à 12:54:51    

Bonjour,
 
J'essaie desespérément établir un tableau regroupant les CA par mois et par année. Ma requette est la suivante:  
 
Select 'Janvier' as mois, CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) AS CA2013, 0.0 AS CA2014  
From  
          Documents  
     Where
           FastFilter <> 0 And Removed <> 1 and  
           (2013) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))
union
Select 'Janvier' as mois, 0.0 AS CA2013, CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) AS CA2014  
From  
          Documents  
     Where
           FastFilter <> 0 And Removed <> 1 and  
           (2014) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))
Group by mois
 
et j'obtiens:  
une ligne Janvier, mon CA de janvier 2013 puis 0
une seconde ligne Janvier, 0 puis mon CA janvier 2014
 
 
Comment puis-je faire en sorte d'obtenir une ligne contatena tjanvier mon CA janvier 2013 et mon CA janvier 2014
 
Je débute en SQL....
 
D'avance merci


Message édité par laurent5711 le 02-04-2014 à 15:08:54
Reply

Marsh Posté le 02-04-2014 à 12:54:51   

Reply

Marsh Posté le 02-04-2014 à 14:14:50    

Dommage la requête serait un minimum indenté, j'aurais pris la peine de regarder.

Reply

Marsh Posté le 02-04-2014 à 15:09:21    

Peut être que sous ce format ça va vous inciter à m'aider, comme je l'ai dit je débute!!!!
D'avance merci


Message édité par laurent5711 le 02-04-2014 à 16:09:32
Reply

Marsh Posté le 02-04-2014 à 16:15:37    

Quel SGBD?
 
A voir ton "group by mois" a la fin de ta requete, je pense que tu voulais plus faire quelque chose comme ca:

Select mois, MAX(CA2013), MAX(CA2014) From
(Select 'Janvier' as mois, CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) AS CA2013, 0.0 AS CA2014  
From  
          Documents  
     Where  
           FastFilter <> 0 And Removed <> 1 and  
           (2013) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and  
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))  
union  
Select 'Janvier' as mois, 0.0 AS CA2013, CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) AS CA2014  
From  
          Documents  
     Where  
           FastFilter <> 0 And Removed <> 1 and  
           (2014) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and  
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))
)
Group by mois

La facon dont ta requete initiale est ecrite fait que le "group by" s'applique seulement a la deuxieme requete de l'union plutot qu'a l'ensemble (enfin je pense) ce qui explique pourquoi tu obtiens toujours deux lignes pour Janvier.
 
Sinon autre option, passer les requetes en sous-requetes dans une clause SELECT (le "FROM dual" c'est du Oracle, a adapter si pas Oracle):

Select 'Janvier' as mois,
   (Select CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) From  
          Documents  
     Where
           FastFilter <> 0 And Removed <> 1 and  
           (2013) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))) AS CA2013,
   (Select CAST(Sum(TTC_Montant - TVA_Montant)  As Decimal(4,4)) From  
          Documents  
     Where
           FastFilter <> 0 And Removed <> 1 and  
           (2014) = EXTRACT(YEAR FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact)) and
           (01)=EXTRACT(Month FROM IF(NoFact = '' THEN (IF(NoLivr = '' THEN DateCmde Else DateLivr)) ELSE DateFact))) AS CA2014
FROM dual


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 02-04-2014 à 16:37:42    

:jap:  :jap:  :jap:  
 
Not bad, je ne connaissais pas la technique du dual  [:roxelay]  
 
 
Sinon il y a les fonctions analytiques, un bon p'tit rollup.
Par contre pas assez pratiqué, donc je ne m'y risquerais pas à faire une démo ^^ (c'est surtout qu'il est presque 17h :p)


Message édité par xuan-khanh le 02-04-2014 à 16:38:34
Reply

Marsh Posté le 03-04-2014 à 07:51:27    

Bonjour,
 
Malheureusement mon logiciel me dit que la requête sql n'est pas correcte :(

Reply

Marsh Posté le 03-04-2014 à 10:23:15    

laurent5711 a écrit :

Bonjour,
 
Malheureusement mon logiciel me dit que la requête sql n'est pas correcte :(


 
.....  [:tibo2002]  
On est plus dans une contrainte SQL là mais logiciel.
 
 
Et quel logiciel utilises-tu ?

Reply

Sujets relatifs:

Leave a Replay

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