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 :

Somme de quelques lignes sur plusieurs colonnes [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut Somme de quelques lignes sur plusieurs colonnes
    Bonsoir à tous j'ai créé une table pour las gestion des pompes dans une station service
    Nom : Captured.PNG
Affichages : 1407
Taille : 9,1 Ko
    SI et SII sont respectivement le robinet 1 et 2 de la pompe1 et SIII et SIV sont respectivemnts les robinet 1 et 2 de la pompe 2 je voudrais en fin de journée avoir la somme des sorties pour la pompe 1 à part et la pompe 2 à part mais je ne sais comment faire pouvez m'aider?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    L'idéal serait une table supplémentaire qui fasse correspondre un identifiant de robinet à un numéro de pompe
    Il ne reste plus à faire qu'une jointure sur cette table et un regroupement par numéro de pompe.

    Si tu ne peux pas créer de nouvelle table, tu serais obligé par un regroupement sur un CASE qui sera sans doute moins efficace et certainement beaucoup moins évolutif.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Merci al1_24 pour votre réponse si vous pouviez me faire un exemple car je ne comprend pas bien se que vous me demander de faire merci

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Si tu as besoin de te rafraichir la mémoire sur les jointures et les regroupements, les tutoriels sont ici et .
    Reviens avec ta requête, nous t'aiderons alors à la mettre au point.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    OK merci al1_24 je me lance tout de suite

  6. #6
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    J'ai créé une table nomer Pompe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE [dbo].[POMPES](
    	[IdPOMPE] [varchar](10) NOT NULL,
    	[POMPE] [varchar](20) NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[IdPOMPE] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
    et j'ai fait une jointure telque vous m'avez expliquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT [DATE],[POMPE],[OPEN],[CLOSE],[PU], ROUND(SUM([CLOSE]-[OPEN]),2) AS SOMME
     
    FROM [POMPES],[STOCKKUMBASUPER]
    WHERE IdPOMPE=IdPOMPE
    GROUP BY [DATE],[IdPOMPE],[OPEN],[CLOSE],[PU], ([CLOSE]-[OPEN])
     
    GO
    Mais lorsque j'exécute j’obtiens les messages d'erreur suivant

    Msg 209, Level 16, State 1, Line 4
    Nom de colonne 'IdPOMPE' ambigu.
    Msg 209, Level 16, State 1, Line 4
    Nom de colonne 'IdPOMPE' ambigu.
    Msg 209, Level 16, State 1, Line 5
    Nom de colonne 'IdPOMPE' ambigu.
    A moins d'avoir mal compris la methode

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    • Puisque la colonne IdPompe apparait dans les deux tables, comment veux-tu que le SGBD sache à laquelle tu te réfères si tu ne lui ajoutes pas l'indication de la table (ou son alias) à laquelle elle appartient ?
    • J'avais compris que tu voulais regrouper par Pompe, ce n'est pas ce que tu as fait.
    • Si tu souhaites afficher les colonnes Close, Open, PU, il faut définir quelle valeur afficher parmi les lignes regroupées mais ne pas les mettre dans les conditions de regoupement.
    • Depuis 25 ans, les jointures s'effectuent avec l'opérateur JOIN.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Ok merci pour ces précision je me lance dessus

  9. #9
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    J'ai ecrit la requette suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [DATE],[POMPE], ROUND(SUM([CLOSE]-[OPEN]),2) AS SOMME
     
    FROM [POMPES] INNER JOIN [STOCKKUMBASUPER]
    ON POMPES.IdPOMPE=STOCKKUMBASUPER.IdPOMPE
    GROUP BY [DATE],[POMPE]
    GO
    Nom : Capturew.PNG
Affichages : 1288
Taille : 3,1 Ko

    mais le résultat n'est pas satisfaisant car je souhaite faire la somme sur SI+SII car c'est la pompe1 et SIII+SIV Pompe2

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Massigne Voir le message
    J'ai ecrit la requette suivante [. . .]
    mais le résultat n'est pas satisfaisant car je souhaite faire la somme sur SI+SII car c'est la pompe1 et SIII+SIV Pompe2
    Bonsoir,

    Je vous renvoie a la remarque de al1_24 un peu plus haut, car elle reste d'actualité :

    Citation Envoyé par al1_24 Voir le message
    L'idéal serait une table supplémentaire qui fasse correspondre un identifiant de robinet à un numéro de pompe
    Il ne reste plus à faire qu'une jointure sur cette table et un regroupement par numéro de pompe.
    Y a plus qu'à

  11. #11
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonjour escartefigue c'est ce que j'ai fait a moins de mal applique j'ai créé une table supplémentaire ces cela qui ma permis d'obtenir le résultat si-dessus

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Ce qui ne va pas, c'est que vous n'avez pas fait correspondre un n° de robinet avec un n° de pompe, votre table supplémentaire ne peut servir qu'à afficher un libellé de pompe...

    La nouvelle table devrait donc ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Id_pompe   Id_robinet
       001          001
       001          002
       002          003
       002          004
       003          005
    etc...
    Il est toujours préférable de choisir des identifiants primaires de format integer, les valeurs "SI", "SII" etc... de type char, devraient être des identifiants alternatifs, mais pas primaires

  13. #13
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    OK merci escartefigue j'essais tout de suite

  14. #14
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    j'ai suivi votre conseil et créé
    la table pompe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE [dbo].[POMPES](
    	[IdPOMPE] int NOT NULL,
    	[IdRoinet] int not NULL,
    )
    GO
    Nom : Capturero.PNG
Affichages : 1281
Taille : 3,5 Ko

    et la table principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE [dbo].[STOCKKUMBASUPER](
    	[DATE] [date] NOT NULL,
    	[IdPOMPE] int NOT NULL,
    	[OPEN] [float] NOT NULL,
    	[CLOSE] [float] NOT NULL,
    	[PU] [float] NULL
    ) ON [PRIMARY]
     
    GO
    Nom : Capturepo.PNG
Affichages : 1291
Taille : 9,8 Ko
    et ensuit la requette suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ELECT [DATE],[IdPOMPE], ROUND(SUM([CLOSE]-[OPEN]),2) AS SOMME
     
    FROM [POMPES] INNER JOIN [STOCKKUMBASUPER]
    ON POMPES.IdPOMPE=STOCKKUMBASUPER.IdPOMPE
    GROUP BY [DATE],[IdPOMPE]
    GO
    mais lorsque jexecute j'obtien
    Msg 209, Level 16, State 1, Line 1
    Nom de colonne 'IdPOMPE' ambigu.

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Dans votre table "STOCKKUMBASUPER" la colonne IDPOMPE est mal nommée, car c'est un identifiant de robinet qui s'y trouve
    Votre table de lien, ne devrait pas non plus s'appeler "POMPE" car c'est une table issue d'une relation entre pompe et robinets, nommez la "POMPE_ROBINET" par exemple
    La table POMPE, devrait contenir (IDPOMPE (PK), numpomp, date_mise_en_service, ....)
    Et il faudrait également poser des contraintes de type REFERENCE pour garantir l'intégrité des identifiants dans les tables où ils sont FK
    Enfin, évitez d'utiliser des noms réservés comme nom d'objet, par exemple votre colonne "DATE" peut être renommée "DATE_SORTIE"

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT T3.idpompe
         , T3.numpompe
         , T1.date_sortie
         , sum(T1.sortie)
    FROM STOCKKUMBASUPER as T1
    INNER JOIN POMPE_ROBINET as T2
       ON T2.idrobinet = t1.idrobinet
    INNER JOIN POMPE as T3
       ON T3.idpompe = T2.idpompe
    GROUP BY T3.idpompe
           , T3.numpompe
           , T1.date_sortie
    Votre erreur "Nom de colonne 'IdPOMPE' ambigu" vient du fait que la colonne est présente dans plusieurs tables, il faut donc utiliser un alias comme je l'ai fait ci-dessus (T1, T2 et T3) ou alors préfixer le nom de la colonne par le nom complet de la table ou de la vue (select STOCKKUMBASUPER .idpompe par exemple)

  16. #16
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Voila la solution était juste prés de mois et je suis aller chercher trop loin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [IdPOMPE], ROUND(SUM([CLOSE]-[OPEN]),2) AS SOMME
     
    FROM  [STOCKKUMBASUPER]
     
    GROUP BY [IdPOMPE]
    GO
    Nom : fr.PNG
Affichages : 1259
Taille : 2,4 Ko

  17. #17
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Oui mais cette solution ne répond pas au problème que tu avais exposé à l'origine...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  18. #18
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonjour al1_24 et on début de journée
    avec cette solution j’obtiens le résultat attendu mais toujours est-il qu'il faut bien que je me penche sur ce que vous avez dit

  19. #19
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonjour escartefigue je vais me pencher sur ce que vous avez dit

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

Discussions similaires

  1. prop.table par ligne sur plusieurs colonnes
    Par yalehaire dans le forum R
    Réponses: 11
    Dernier message: 26/02/2016, 18h51
  2. [DI 5.4.1] Partager équitablement n lignes sur plusieurs colonnes
    Par Elros dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 12/09/2014, 09h07
  3. Restitution champ ligne sur plusieurs colonnes
    Par mat_lefebvre dans le forum Excel
    Réponses: 2
    Dernier message: 18/09/2013, 14h56
  4. Réponses: 1
    Dernier message: 03/10/2008, 13h29
  5. Réponses: 2
    Dernier message: 11/01/2007, 12h56

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