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 27/09/2011, 15h41   #1
Futur Membre du Club
 
Inscription : janvier 2005
Messages : 68
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 68
Points : 17
Points : 17
Par défaut Pb SQL : regroupement + min

Bonjour,

J'ai une requête qui me sort une liste de valeurs dont
j'aimerais ne retenir qu'une seule partie :

TABLE T1
ID ID2 DATE QTE
91558 1031 20110921 195
91559 1031 20110922 195
91560 1031 20110923 195
91561 1031 20110919 195
91562 1031 20110920 195
91563 1031 20110921 195
91564 1031 20110922 195
91565 1031 20110923 195
91566 1031 20110919 197
91567 1031 20110920 197

Dans ce cas là
91558 1031 20110921 195
91566 1031 20110919 197

(Où je ne garde que le ID mininum).
Le but étant à la fin de faire un SUM(QTE)

J'ai essayé de faire ça en 2 fois dans la même requête
mais je ne sais pas faire un WHERE IN avec 2 critères :

Par exemple :

Code :
1
2
3
4
5
6
7
SELECT SUM(QTE)
FROM TABLE1
WHERE Champ1, Champ2
IN SELECT DISTINCT Champ1, Champ2
FROM TABLE1
WHERE ChampX = Critere1
AND     ChampY = Critere2
Ici, la requête du dessous me sort la liste exacte des
valeurs qui m'intéresse (je fais disparaitre ID) mais mon
soucis est de dire que je veux matcher sur 2 champs le
IN.

J'utilise SQL Server.

Merci d'avance,
youpitralala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 16h10   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Apparemment, tu as besoin d'apprendre les jointures !

Citation:
(Où je ne garde que le ID mininum).
Minimum par rapport à quoi ?
Pour chaque QTE ?

Dans ce cas, MIN et GROUP BY te seront utiles.
__________________
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 27/09/2011, 16h23   #3
Futur Membre du Club
 
Inscription : janvier 2005
Messages : 68
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 68
Points : 17
Points : 17
Citation:
Envoyé par CinePhil Voir le message
Apparemment, tu as besoin d'apprendre les jointures !


Minimum par rapport à quoi ?
Pour chaque QTE ?

Dans ce cas, MIN et GROUP BY te seront utiles.
Bonjour,

En fait, j'ai résolu ça par programmation, je ne garde l'ID que si 1 critère
parmi DATE, ID2 et QTE change. Je connais un minimum les jointures mais
je m'orientais plus vers des IN ou des MATCH ou des HAVING pour tout faire en une seule grosse requête.

Merci
youpitralala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 18h21   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
Tu peux écrire la requête que tu présentes comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT  SUM(qte)
FROM    table1
WHERE   (   champ1
        ,   champ2
        )
    IN  (   SELECT DISTINCT 
                    champ1
                ,   champ2
            FROM    table1
            WHERE   champx = critere1
                AND champy = critere2
        )
;
Ou comme cela :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT  SUM(qte)
FROM    table1  tb1
WHERE   EXISTS
        (   SELECT  0
            FROM    table1  tb2
            WHERE   tb2.champx = critere1
                AND tb2.champy = critere2
                AND tb2.champ1 = tb1.champ1
                AND tb2.champ2 = tb1.champ2
        )
;
Pour passer de ta première liste à la seconde :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  t1.id
    ,   t1.id2
    ,   t1.date
    ,   t1.qte
FROM    t1  tb1
WHERE   EXISTS
        (   SELECT  0
            FROM    t1  tb2
            WHERE   tb1.qte = tb2.qte
            HAVING  tb1.id  = MIN(tb2.id)
        )
;
__________________
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h56.


 
 
 
 
Partenaires

Hébergement Web