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

Développement SQL Server Discussion :

Addition de COUNT


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Addition de COUNT
    Bonjour à tous,

    Je me torture les méninges pour trouver une requête.
    Voici mon problème.(Pour simplifier, le nom des tables sont fictives)

    J'ai 3 tables qu'on va appeler TAB_VELO_VERT, TAB_VELO_ROUGE, TAB_VELO_JAUNE.
    Dans chaque table, j'ai plusieurs entrées identifiées par la clé ID_VELO_VERT pour la table TAB_VELO_VERT, ID_VELO_ROUGE pour la table TAB_VELO_ROUGE, etc..
    Dans chaque table, il y a également un champs Datetime appelé VELO_DAT_CRE (le nom est commun aux trois tables et désigne la date de création de la fiche du "vélo")
    Et pour finir, il y a également dans chaque table un champ désignant une clé étrangère (pour le propriétaire) nommée ID_PROPRIO.
    On va considérer que dans la table des propriétaires (TAB_PROPRIO) qu'il existe une clé étrangère ID_PARKING me donnant l'ID d'un parking.
    J'ai également une vue ([VUE : CEN : Liste des parking ouverts]) me donnant tous les parking ouverts

    Je dois sortir une procédure stockée me donnant le nombre de vélos, par année et par parking ouvert (sachant qu'il existe trois types de vélos (les vert, les rouges et les jaunes stockés dans 3 tables distinctes) mais on veut comptabiliser les vélos dans leur ensemble).
    J'espère avoir été clair. Désolé pour cette histoire de vélo mais c'est pour simplifier ma question car avec les vraies tables ça aurait été incompréhensible pour vous et difficilement explicable.

    j'arrive bien à sortir le nombre de vélos mais pour chacune des tables. Pas les trois à la fois. (l'idéal serait d'avoir le résultat pour chaque table dans une variable afin de pourvoir récupérer le résultat par type de vélo si on me le demande)

    Pour l'instant, ma requête ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT YEAR(VELO_DAT_CRE) As ANNEE,COUNT(ID_VELO_VERT ) As NOMBRE_VELO, LIBELLE_PARKING As PARKING
    FROM dbo.TAB_VELO_VERT INNER JOIN dbo.TAB_PROPRIO
    ON TAB_PROPRIO.ID_PROPRIO = TAB_VELO_VERT.ID_PROPRIO
    INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
    ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(VELO_DAT_CRE), LIBELLE_PARKING
    je sors bien ce que je veux mais pour chaque type de vélo, pas les 3 ensemble. Je ne vois pas comment regrouper les résultats.
    Un peu d'aide ? Merci par avance en tout cas.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    WITH 
    VeloVert AS
    (
    SELECT YEAR(VELO_DAT_CRE) As ANNEE,
           COUNT(ID_VELO_VERT ) As NOMBRE_VELO, 
           LIBELLE_PARKING As PARKING
    FROM   dbo.TAB_VELO_VERT 
           INNER JOIN dbo.TAB_PROPRIO
                 ON TAB_PROPRIO.ID_PROPRIO = TAB_VELO_VERT.ID_PROPRIO
           INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
                 ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(VELO_DAT_CRE), LIBELLE_PARKING
    ),
    VeloJaune AS
    (
    SELECT YEAR(VELO_DAT_CRE) As ANNEE,
           COUNT(ID_VELO_JAUNE ) As NOMBRE_VELO, 
           LIBELLE_PARKING As PARKING
    FROM   dbo.TAB_VELO_JAUNE 
           INNER JOIN dbo.TAB_PROPRIO
                 ON TAB_PROPRIO.ID_PROPRIO = TAB_VELO_JAUNE.ID_PROPRIO
           INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
                 ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(VELO_DAT_CRE), LIBELLE_PARKING
    ),
    VeloRouge AS
    (
    SELECT YEAR(VELO_DAT_CRE) As ANNEE,
           COUNT(ID_VELO_ROUGE ) As NOMBRE_VELO, 
           LIBELLE_PARKING As PARKING
    FROM   dbo.TAB_VELO_ROUGE 
           INNER JOIN dbo.TAB_PROPRIO
                 ON TAB_PROPRIO.ID_PROPRIO = TAB_VELO_ROUGE.ID_PROPRIO
           INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
                 ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(VELO_DAT_CRE), LIBELLE_PARKING
    ),
    Parks AS
    (SELECT PARKING
     FROM   VeloVert
     UNION  
     SELECT PARKING
     FROM   VeloJaune
     UNION 
     SELECT PARKING
     FROM   VeloRouge
    ),
    An AS
    (SELECT ANNEE
     FROM   VeloVert
     UNION  
     SELECT ANNEE
     FROM   VeloJaune
     UNION 
     SELECT ANNEE
     FROM   VeloRouge
    ),
    ParkAn AS
    (
    SELECT A.ANNEE, P.PARKING
    FROM   Parks AS P
           CROSS JOIN An AS A
    )
    SELECT PA.ANNEE, PA.PARKING, VV.NOMBRE_VELO + VJ.NOMBRE_VELO + VR.NOMBRE_VELO AS TOTAL_VELO
    FROM   ParkAn AS PA
           LEFT OUTER JOIN VeloVert AS VV
                ON PA.ANNEE = VV.ANNEE AND PA.PARKING = VV.PARKING
           LEFT OUTER JOIN VeloJaune AS VJ
                ON PA.ANNEE = VJ.ANNEE AND PA.PARKING = VJ.PARKING
           LEFT OUTER JOIN VeloRouge AS VR
                ON PA.ANNEE = VR.ANNEE AND PA.PARKING = VR.PARKING;

    Visiblement vous avez un problème de modélisation... Connaissez vous l'héritage des données ?
    A me lire : http://sqlpro.developpez.com/cours/m...tion/heritage/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Plus simple egalement est d'utiliser l'operateur ensembliste UNION ALL par exemple.
    Mais il est clair que les formes normales de CODD ne sont pas respectees ici.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup (désolé pour les remerciements tardifs).
    Je vais essayer tout ça.
    Merci mille fois.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Plus simple egalement est d'utiliser l'operateur ensembliste UNION ALL par exemple.
    Mais il est clair que les formes normales de CODD ne sont pas respectees ici.
    Clairement.

    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
     
    SELECT YEAR(VELO_DAT_CRE) AS ANNEE,COUNT(*) AS NOMBRE_VELO, LIBELLE_PARKING AS PARKING
    FROM (
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_VERT
    UNION ALL
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_ROUGE
    UNION ALL
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_JAUNE
    ) AS TOUS_VELOS  INNER JOIN dbo.TAB_PROPRIO
    ON TAB_PROPRIO.ID_PROPRIO = TOUS_VELOS.ID_PROPRIO
    INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
    ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(TOUS_VELOS.VELO_DAT_CRE), LIBELLE_PARKING
    Most Valued Pas mvp

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Clairement.

    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
     
    SELECT YEAR(VELO_DAT_CRE) AS ANNEE,COUNT(*) AS NOMBRE_VELO, LIBELLE_PARKING AS PARKING
    FROM (
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_VERT
    UNION ALL
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_ROUGE
    UNION ALL
    SELECT ID_PROPRIO, VELO_DAT_CRE
    FROM dbo.TAB_VELO_JAUNE
    ) AS TOUS_VELOS  INNER JOIN dbo.TAB_PROPRIO
    ON TAB_PROPRIO.ID_PROPRIO = TOUS_VELOS.ID_PROPRIO
    INNER JOIN [dbo].[VUE : CEN : Liste des parking ouverts]
    ON [VUE : CEN : Liste des parking ouverts].[ID_PARKING] = TAB_PROPRIO.ID_PARKING
    GROUP BY YEAR(TOUS_VELOS.VELO_DAT_CRE), LIBELLE_PARKING
    Oui, mais s'il y a aucun vélo dans un des parking une année, alors elle n'apparaitra pas cette ligne...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Addition de deux count
    Par bond70 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2010, 15h15
  2. Multiple Count
    Par Antichoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2003, 11h19
  3. [VB6] Problème d'addition de dates et de nombres
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/11/2002, 21h12
  4. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22
  5. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41

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