Requete SQL - 3 mois glissants [Résolu]

bbertt 3 Messages postés mardi 3 février 2009Date d'inscription 10 juin 2009 Dernière intervention - 27 avril 2009 à 09:47 - Dernière réponse : crn_c21 303 Messages postés samedi 24 janvier 2004Date d'inscription 4 février 2011 Dernière intervention
- 2 mai 2009 à 15:35
Avant toutes choses, Bonjour a tous

Je tiens à vous remercier car le forum m'a permis de répondre à une grande quantité de questions durant mon stage.
Cependant, aujourd'hui je me vois obliger de demander encore un plus d'aide de votre part :

Serveur : SQL Server 2000

Dans le cadre de mon stage j'aimerais pouvoir rassembler dans même tableau la comparaison de deux données comme ceci.

J'ai donc une base où j'ai les éléments suivant

Affaire    |  Tps Passé sur l'affaire   |  Mois   | Année
XXXX   |     100 h                        |    11     |   2008
XXXX   |     400 h                        |    12     |   2008
XXXX   |     800 h                        |    1       |   2009
XXXX   |     200 h                        |    2       |   2009
XXXX   |     500 h                        |    3       |   2009

Je voudrais obtenir la liste suivante (le but étant d'exploiter les données dans un tableau croisé dynamique)

Affaire    |  Tps Passé sur l'affaire  |  Tps Passé durant les 3 derniers mois |  Mois   | Année
XXXX   |     800 h                       |         100 + 400 + 800 = 1300 h        |    1       |   2009
XXXX   |     200 h                       |         400 + 800 + 200 = 1400 h        |    2       |   2009

XXXX   |     500 h                       |         800 + 200 + 500 = 1500 h        |    3       |   2009

Apprenant par en partie par autoformation, j'ai essayé différente méthode dont les sous requetes, mais je pense que je l'ai ai mal utilisées :

J'ai testé des choses du genre, mais sans succès
Select Affaire ,codePoste,  SUM(DureeExecution), (SELECT SUM(DureeExecution) FROM ....WHERE [Affaire] = Affaire ... ) FROM ....

J'espere que ce que j'ai explicité ma demande au mieux, et qu'il est possible de le faire directement en sql. Mais je suis avide de toutes les proposition que vous pourrez me faire.

Merci d'avance de votre attention, et encore plus pour ceux qui me répondront
Afficher la suite 

5 réponses

Répondre au sujet
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 27 avril 2009 à 12:31
+3
Utile
Bonjour

une requete comme celle ci devrait faire l'affaire :

SELECT A.Affaire, A.Temps, A.Mois, A.annee, (A.temps + B.temps + C.temps) as Temps3derniersMois
FROM Matable A
INNER JOIN Matable B     ON (A.Affaire B.affaire AND CAST((CAST(A.Annee as varchar(10)) + '-' + CAST(A.Mois as varchar(10) + '-01') AS DATETIME) DATEADD(month, -1, CAST((CAST(B.Annee as varchar(10)) + '-' + CAST(B.Mois as varchar(10) + '-01') AS DATETIME)
INNER JOIN Matable C
    ON (A.Affaire = C.affaire AND CAST((CAST(A.Annee
as varchar(10)) + '-' + CAST(A.Mois as varchar(10) + '-01') AS
DATETIME) = DATEADD(month, -2, CAST((CAST(C.Annee as varchar(10)) + '-'
+ CAST(C.Mois as varchar(10) + '-01') AS DATETIME)

Je n'ai pas testé, mais l'idée est la je pense (utiliser 3 fois la meme table)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
bbertt 3 Messages postés mardi 3 février 2009Date d'inscription 10 juin 2009 Dernière intervention - 27 avril 2009 à 14:03
+3
Utile
Re Bonjour,

En essayant de comprendre vos deux solutions, et en suivant les bon conseils de l'ami greg j'ai trouver une solution peut etre pas aussi propres que greg mais pour moi plus accessible, un petit plus claire que celle de aieeeuuuu mais pas pour autant meilleur et plus efficace ....

Effectivement, comme je le laissais présager dans mon premier message, j'ai utilisais les sous requetes et les 'alias' qui permettent de remonné les tables ( merci pour le commentaire aieeeuuu ... )

SELECT     A.Affaire, A.Temps, A.Mois, A.annee, 
    (SELECT SUM(T1.DureeExecution)
    FROM dbo.[xxxxxxx] AS T1
    WHERE T1.Affaire = T.Affaire
            AND T1.Affaire = T.Affaire
            AND ....
            AND ......

FROM         dbo.[xxxxxxx] as T
WHERE DATEPART(yy,T.DateTravail) = 2009

Je tiens a remercier le forum pour sa réactivité et sa gentillesse .... Pr un premier forum, je suis surpris d'avoir eu une reponse si rapide

PS : Merci pr tes encouragement greg 

Bbertt
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bbertt
gperuch 40 Messages postés dimanche 18 janvier 2009Date d'inscription 2 février 2012 Dernière intervention - 27 avril 2009 à 12:34
0
Utile
Salut,
Je te conseil de faire une procédure stocké
1 car ça va etre plus simple
2 celui qui passera derniere toi comprendra plus vite ce que tu as voulu faire

la proc stock: (tu corrigeras les erreurs je la fais en live)
create proc resultat as
-- creation d'une table temporaire qui va contenir ton resultat
create table # temp
(Affaire varchar(50), TpsPassésurlaffaire int ,  mois_1 int ,mois_2 int ,mois_3 int ,  Mois int  , Année int)
-- 1er temps, insert la clef soit:
insert into # temp
(Affaire , TpsPassésurlaffaire  ,  mois_1 int ,  Mois int  , Année int)
select
Affaire    ,  Tps Passé sur l'affaire   , Tps Passé sur l'affaire , Mois , Année from ta_premiere_table

ensuite tu updates mois_2 et moi_3 de ta table temps avec les valeur du mois precedent...

mais là je te laisse te creuser un peu les neurones.... apres tout c'est à ca que sert un stage...

bon courage

greg

greg
Commenter la réponse de gperuch
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 27 avril 2009 à 14:11
0
Utile
re,

cette derniers solution ne prend pas en compte uniquement les 3 derniers mois, mais tous les mois précédents...

sinon pour exlpiquer un peu la solution que j'avais evoquée, l'idée et de faire une jointure de la table sur elle meme, afin que poru chaque affaire, on ait sur la meme ligne, le nombre d'heures pour le mois en cours (table A), le nombre d'heures pour le mois précédents (table B), et le nombre d'heure pour le mois d'avant( table C)
après il ne reste qu'a faire la somme

ce qui rend ma requete compliquée, c'est justement que la date ne soit pas contenue dans un seul champs, et donc pour comparer, il faut caster, concatener,  et recaster :)
Commenter la réponse de aieeeuuuuu
crn_c21 303 Messages postés samedi 24 janvier 2004Date d'inscription 4 février 2011 Dernière intervention - 2 mai 2009 à 15:35
0
Utile
Plutot d'avis d'utiliser la procédure stockée.

Par contre pour la création de la table temporaire, mieux vaut la créer en mémoire pluto qu'en physique dans le tempsDb(plus rapide)

create table @temp table
(Affaire varchar(50), TpsPassésurlaffaire int ,  mois_1 int ,mois_2 int ,mois_3 int ,  Mois int  , Année int)
-- 1er temps, insert la clef soit:
insert into  @temp
(Affaire , TpsPassésurlaffaire  ,  mois_1 ,  Mois , Année )
select
Affaire    ,  Tps Passé sur l'affaire   , Tps Passé sur l'affaire , Mois , Année from ta_premiere_table
Commenter la réponse de crn_c21

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.