Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2010, 08h57   #1
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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!
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 09h05   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
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 ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 09h27   #3
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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 :
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....
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 10h07   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Si je comprends bien, sont des doublons les lignes qui ont le couple {Incident, quantite} identiques.

Extrayons de t1 les couples distincts :
Code :
1
2
SELECT DISTINCT Incident, quantite
FROM t1
Ensuite on peut joindre cette sous-requête à t2 et faire la somme :
Code :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 10h25   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 455
Points : 10 455
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 11h10   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Exact ! Je n'avais pas fait attention au doublon {incident, nom} dans T2 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 02h10   #7
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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 :
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
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h38.


 
 
 
 
Partenaires

Hébergement Web