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

Langage SQL Discussion :

Encore un probleme de doublons relatifs, avec SUM


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Encore un probleme de doublons relatifs, avec SUM
    Bonjour,

    J'ai pas mal cherche, mais mes requetes restent sans succes
    J'ai deux tables ou des doublons relatifs se baladent...

    table t1
    ID - incident - quantite1
    23 - 2345 - 50
    24 - 2345 - 50
    32 - 2456 - 30
    26 - 4356 - 15

    table t2
    ID - incident - Nom
    45 - 2345 - A
    46 - 2345 - A
    57 - 2456 - A
    78 - 4356 - B

    Donc seul point de liaison: l'incident.
    Je ne l'ai pas mis, mais ca arrive que les quantites soient NULLS (donc ca implique un ISNULL(quantite,0)

    Mon but final est d'obtenir:

    A = 70 (donc SUM + WHERE Nom = A +GROUP BY sur Nom)

    J'ai tout essaye (UNION, SELECT, INNER JOIN, HAVING, GROUP BY)
    et j'arrive a obtenir:
    A = 100 (adition des doublons uniquement)
    ou A =30 (exclusion total des doublons)
    et bien sur la plus part du temps A=130...

    Je ne sais plus quel code mettre ici... il y a eu tellement de changements (avec tellement de message d'erreurs )
    Help
    Miiiiiiii Je craaaque!

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je crois comprendre que tu peux faire une jointure entre t1 et t2 sur la colonne 'incident' mais tu es censée l'obtenir comment ton A = 70 ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Normalement les Incidents sont uniques, c'est un beug lors de l'ecriture qui creer ces doublons (j'aimerai bien les supprimer directement, mais je n'en ai pas le droit)

    En tous cas c'est:
    1 incident -> 1 nom
    1 nom -> n incidents

    mmmm... Parlons SQL ce sera pit etre plus clair, mais j'ai un peu honte de montrer ca... c'est du bricolage

    Mais voici une requete (qui ne marche pas a cause des deux GROUP BY je crois; mais si j'enleve le GROUP BY et le MIN ben je retrouve mes chers doublons malgre le DISTINCT)
    En tous cas ca represente bien l'idee de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT SUM(ISNULL(quantite,0)), 
              FROM t1
    INNER JOIN (
              SELECT DISTINCT Incident,Nom ,MIN(ID)  FROM t2
              WHERE t2.Nom='A'
                  AND t2.Date>'2010-09-01'
                  AND t2.Incident>'0' 
    GROUP BY Incident) v
              ON v.Incident = t1.Incident
              GROUP BY v.Nom";
    Si vous le souhaitez je peux vous en sortir encore plein des comme ca

    J'ai aussi regarde sur:
    http://sqlpro.developpez.com/cours/doublons/#L3

    Avec ca j'arrive a avoir la somme de mes doublons (A=100)...

    Erf....

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Si je comprends bien, sont des doublons les lignes qui ont le couple {Incident, quantite} identiques.

    Extrayons de t1 les couples distincts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Incident, quantite
    FROM t1
    Ensuite on peut joindre cette sous-requête à t2 et faire la somme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t2.Nom, SUM(tmp.quantite) AS somme
    FROM t2
    INNER JOIN (
        SELECT DISTINCT t1.Incident, t1.quantite
        FROM t1
        ) tmp ON tmp.Incident = t2.Incident
    GROUP BY t2.Nom

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    J'imagine qu'il faut faire un distinct sur les deux tables.
    Le ISNULL m'amène à pense qu'il s'agit de MS SQL-Server :
    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
    with t1 (ID, incident, quantite1) as 
    (
    select 23, 2345, 50 union all
    select 24, 2345, 50 union all
    select 32, 2456, 30 union all
    select 26, 4356, 15
    )
      ,  t2 (ID, incident, Nom) as
    (
    select 45, 2345, 'A' union all
    select 46, 2345, 'A' union all
    select 57, 2456, 'A' union all
    select 78, 4356, 'B'
    )
      ,  new_t1 (incident, quantite1) as
    (
    select distinct incident, quantite1
      from t1
    )
      ,  new_t2 (incident, Nom) as
    (
    select distinct incident, Nom
      from t2
    )
      select t2.Nom, sum(coalesce(t1.quantite1, 0)) as quantite
        from new_t1 as t1
             inner join new_t2 as t2
               on t2.incident = t1.incident
    group by t2.Nom;
     
    Nom  quantite
    ---- -----------
    A    80
    B    15

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Exact ! Je n'avais pas fait attention au doublon {incident, nom} dans T2 !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Youhouuuuu!!
    Je n'avais pas chercher a faire un DISTINCT sur les deux bases moi non plus (pourtant je le voyais bien qu'il y avait des doublons sur les deux bases...)

    Le WITH a ete totalement refuse par mon SQL... dommage.
    En revanche du coup j'ai fait un double distinct (pourtant simple ) et ca marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT v.Nom, SUM(quantity1) AS somme
    FROM (SELECT DISTINCT t2.Incident, Nom FROM t2 WHERE Nom='A' AND t2.Date>'2010-09-01')v
    INNER JOIN (SELECT DISTINCT t1.Incident, ISNULL(t1.quantite,0) As quantity1 FROM t1) tmp
        ON tmp.Incident = v.Incident
    GROUP BY v.Nom
    Merci a vous deux!!

    PS: oui 50+30 = 80 et non 70... je n'etais pas reveillee hier

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

Discussions similaires

  1. Identifier doublons relatifs avec une seule table
    Par idate dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/09/2013, 11h37
  2. [Mail] Encore un probleme de mail avec piece jointe
    Par gretch dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2006, 11h33
  3. Réponses: 1
    Dernier message: 14/04/2006, 11h02
  4. [MySQL] Encore un probleme de variables avec les requetes sql
    Par eown dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/04/2006, 11h01
  5. Encors un problem avec IE
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 24/10/2005, 16h55

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