IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Select avancé avec MS SQL Server


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut Select avancé avec MS SQL Server
    Bonjour tout le monde, j'ai une table qui ressemble un peu a ça :

    Année | Mois | Nombre d'accident
    2010 Aout 5
    2010 Avril 4
    2010 Novembre 8

    Mois je veux faire un Select sur cette table, de tel sorte a ce qu'il me renvoie le résultat comme ça:

    Année | Mois | Nombre d'accident
    2010 Aout 5
    2010 Avril 4
    2010 Décembre 0
    2010 février 0
    2010 Janvier 0
    2010 juillet 0
    2010 juin 0
    2010 Mars 0
    2010 Mai 0
    2010 Novembre 8
    2010 Octobre 0
    2010 Septembre 0

    donc je veux Avoir les 12 mois dans le résultat de la requête même s'il n'existent pas, ces 12 mois, tous sur la table et puis mettre zéro dans la valeur du nombre d'accident.

    si qlq1 peut me donner un coup de main SVP, Merci bien

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Vous pouvez créer une table des mois et des années, puis faire un produit cartésien entre les deux et enfin une jointure externe vers votre table d'accidents.

    Il serait préférable que cette dernière soit normalisée et fasse référence à la table mois plutôt qu'y stocker le libellée des mois.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    j'avais déjà penser a créer des table et tout, mais le souci, c'est que j'ai pas la main pour pouvoir ajouter ou modifier ou créer des tables au niveau de la base de données.

    c'est pour ça que j'aimerai savoir s'il y a une requête "SELECT ..." qui me permet d'avoir ce genre de résultat.

    Merci quand mm pour ta réponse.

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Bonjour ,

    tu peux passer par des tables sous-jacentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select A.a ,M.m ,T.n
    from Ta_table T
        ,(select "janvier" union all
          select "fevrier"  ... 
         )as M(m)
        ,(select 2010 union all
          select 2011 ...
         )as A(a)
    where T.m =* M.m 
    and   T.a =* A.a

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    je n'ai pas bien compris ce concept, mais pour ajouter, j'ai d'autres champs que je dois sélectionner que l'année et le mois et le nombre d'accidents, et bien évidement, les valeurs des années et tout ne sont pas mentionnées au niveau de la requête.

    par exemple je fais :

    Select ...année, mois, nbr_accident...
    from ....
    Group by ...,année, mois...

    voilà

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Cela te permet de creer une table juste pour la requete,
    dans mon exemple j'ai créé les table A (a) et M(m) .
    Apres tu fais ce que tu veux avec, et en particulier ce a quoi tu pensais si tu avais pu creer des vrais tables.

    Tu peux mettre A.a et M.m partout : dans le select, le where , un group by , un order by ...

    NB : dans l'exemple il te faut isnull(T.n, 0 ) evidemment

    PS : si select ... from ( select ... ) ... ne passe pas, j'ai deja vu des post avec WITH sur ce forum.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    pour être plus précis, voici la requête de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select vms.ste 
    , vms.annee_paie
    , vms.mois_paie
    , s.regroup_3
    , sum(vms.massesal) tot_masse_sal 
    , count(*) Effectif
    from view_masse_sal vms, societe s
    where vms.ste = s.ste
    group by vms.ste 
    , vms.annee_paie
    , vms.mois_paie
    , s.regroup_3
    alors si vous pouvez me donner la solution, j'ai essayé quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select vms.ste 
    , vms.annee_paie
    , m.mois
    , sum(vms.massesal) tot_masse_sal 
    , count(*) Effectif
    from view_masse_sal vms, (select distinct(vms.mois_paie) from view_masse_sal vms) as M(mois)
    where m.mois = vms.mois_paie
    group by vms.ste 
    , vms.annee_paie
    , m.mois
    mais ça ne donne pas de résultat, et si j’enlève la clause 'where', ça me fait la somme de tous les mois qui figure sur chaque mois.

    cad : si la somme pour l'année 2010 est 2000, je me retrouve avec 2000 pour janvier et 2000 pour février ...

    Merci déjà pour ton soutient, j'ai pu voir pas mal de chose a travers tes recommandations, merci encor une foi.

  8. #8
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT vms.ste 
          ,vms.annee_paie
          ,m.mois
          ,sum(vms.massesal) tot_masse_sal 
          ,count(*) Effectif
    FROM view_masse_sal vms
        ,(SELECT DISTINCT(vms.mois_paie) FROM view_masse_sal vms) AS M(mois)
    WHERE m.mois *= vms.mois_paie
    GROUP BY vms.ste 
            ,vms.annee_paie
            ,m.mois
    A l'etoile pres ca me semble devoir repondre.
    Apres il faut rajouter societe et essayer de d'exprimer tout ca avec la syntaxe left/right join

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    malheureusement avec l'étoile prés ça ne marche pas, ça me génère une erreur genre 'impossible de spécifier des tables jointes dans une requêtes contenant des jointures externes..."

    c'est a cause de la vue VIEW_MASSE_SAL qui est un produit de jointures externes.

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    En supposant que annee_paie et mois_paie soient des entiers, cette requête à base de CTE devrait donner le cumul de la masse salariale par mois et années exprimées dans la CTE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    WITH 
    Mois (NumeroMois, LibelleMois) as (
    	SELECT 1, 'Janvier'
    		UNION ALL
    	SELECT 2, 'Février'
    		UNION ALL
    	SELECT 3, 'Mars'
    		UNION ALL
    	SELECT 4, 'Avril'
    		UNION ALL
    	SELECT 5, 'Mai'
    		UNION ALL
    	SELECT 6, 'Juin'
    		UNION ALL
    	SELECT 7, 'Juillet'
    		UNION ALL
    	SELECT 8, 'Août'
    		UNION ALL
    	SELECT 9, 'Septembre'
    		UNION ALL
    	SELECT 10, 'Octobre'
    		UNION ALL
    	SELECT 11, 'Novembre'
    		UNION ALL
    	SELECT 12, 'Décembre'
    	),
    Annee (NumeroAnnee)	as (
    	SELECT 2010
    		UNION ALL
    	SELECT 2011
    	)
    SELECT 
    	A.NumeroAnnee, 
    	M.LibelleMois, 
    	sum(vms.massesal) as tot_masse_sal 
    FROM Mois M
    	CROSS JOIN Annee A 
    		LEFT JOIN view_masse_sal vms 
    			ON vms.annee_paie = A.NumeroAnnee 
    			AND vms.mois_paie = M.NumeroMois 
    GROUP BY 
    	A.NumeroAnnee, 
    	M.LibelleMois
    ORDER BY 
    	A.NumeroAnnee, 
    	M.LibelleMois
    La prochaine fois donnez la structure des tables mises en jeu.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    merci bien pour ta réponse, je vais essayer ça.

Discussions similaires

  1. Problème Connection Jbuilder avec MS SQL Server 2000
    Par kchami77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/02/2006, 23h29
  2. Rafraichissement des données avec ADOConnection -SQL Server
    Par newfsch dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/01/2006, 21h48
  3. probelem avec instance SQL server 2000
    Par timsah dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/12/2005, 12h13
  4. Algo de selection d'une frequence (sql server)
    Par edmotets dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/11/2005, 16h26
  5. INSUFFICIENT MEMORY avec MS SQL SERVER 7
    Par AODRENN dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/10/2005, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo