Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 29/11/2010, 19h32   #1
Membre du Club
 
Inscription : octobre 2006
Messages : 429
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 429
Points : 66
Points : 66
Par défaut extraction des lignes en double ou plus seulement

Bonjour

J'aimerais extraire toutes les lignes d'une table T1 qui ont le champ c1 plus qu'une fois.

Exemple :

Citation:
c1 c2 c3 c4
10 25 6 45
10 14 7 87
10 5 25 88
11 14 58 47
13 14 58 68
dans ce cas j'aimerais obtenir le résultat suivant :

Citation:
10 25 6 45
10 14 7 87
Code :
1
2
3
4
5
6
 
SELECT c1, c2, c3, c4
FROM T1
WHERE c2 > 10 et c3 < 8
GROUP BY c1 > 2
HAVING ...
Merci de votre aide.
DEV-10 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/11/2010, 20h16   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
Il existe des dizaines de façon d'écrire cette requête. Mais comme vous n'avez pas respecté la charte de postage et donc pas donné la structure de la table il est difficile de vous donner la meilleures...

Voici une solution :

Jeu d'essai :
Code :
1
2
3
4
5
6
7
8
CREATE TABLE T1 (C1 INT, C2 INT, C3 INT, C4 INT)
 
INSERT INTO T1 
VALUES (10, 25,  6, 45),
       (10,  5, 25, 88),
       (10, 14,  7, 87),
       (11, 14, 58, 47),
       (13, 14, 58, 68);
Solution :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * 
FROM   T1 AS T2
WHERE  EXISTS(SELECT 1
                  FROM   T1 AS T3
                  WHERE  T3.C1 = T2.C1
                  GROUP  BY C1
                  HAVING COUNT(*) = 1)
UNION
SELECT *
FROM   T1 AS T2
WHERE  EXISTS (SELECT * 
               FROM   T1  AS T3
               WHERE  T2.C1 = T3.C1
                 AND  T2.C2 > T3.C2)
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 20h42   #3
Membre du Club
 
Inscription : octobre 2006
Messages : 429
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 429
Points : 66
Points : 66
Il me semble que c'est un peu plus compliquer de ce que je cherche, de plus, je l'ai essayé et ca ne me donne pas le résultat escompté.

Citation:
Envoyé par SQLpro Voir le message
Il existe des dizaines de façon d'écrire cette requête. Mais comme vous n'avez pas respecté la charte de postage et donc pas donné la structure de la table il est difficile de vous donner la meilleures...

Voici une solution :

Jeu d'essai :
Code :
1
2
3
4
5
6
7
8
CREATE TABLE T1 (C1 INT, C2 INT, C3 INT, C4 INT)
 
INSERT INTO T1 
VALUES (10, 25,  6, 45),
       (10,  5, 25, 88),
       (10, 14,  7, 87),
       (11, 14, 58, 47),
       (13, 14, 58, 68);
Solution :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * 
FROM   T1 AS T2
WHERE  EXISTS(SELECT 1
                  FROM   T1 AS T3
                  WHERE  T3.C1 = T2.C1
                  GROUP  BY C1
                  HAVING COUNT(*) = 1)
UNION
SELECT *
FROM   T1 AS T2
WHERE  EXISTS (SELECT * 
               FROM   T1  AS T3
               WHERE  T2.C1 = T3.C1
                 AND  T2.C2 > T3.C2)
A +
DEV-10 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 30/11/2010, 09h17   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
D'où intérêt encore une fois de respecter la charte de postage. En ne le faisant pas vous nous faites travailler gratuitement et en vain.
http://www.developpez.net/forums/d96...vement-poster/
C'est du temps perdu pour vous et moi, en plus d'être impoli !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 10h50   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour
essayez peut être ceci alors

Code :
1
2
3
4
5
6
       SELECT C1,C2,C3,C4
       FROM (
           SELECT *,  COUNT(*) OVER (PARTITION BY C1 ) AS NbC1
           FROM T1
       ) tmp
       WHERE NbC1 > 1
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 19h31   #6
Membre du Club
 
Inscription : octobre 2006
Messages : 429
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 429
Points : 66
Points : 66
Merci bien aieeeuuuuu, ceci me donne le bon résultat.

Par la même occasion, j'aimerais dire à SQLPro que je ne suis pas une personne impolie et je demande qu'il présente des excuses.

Merci.
DEV-10 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/12/2010, 15h17   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Ce que SQL-Pro entendait par impoli était le fait de ne pas respecter la charte du forum, qui vous indique par ailleurs de placer le sujet a "résolu" lorsque celui-ci est... résolu.

Ceci fait aussi gagner du temps aux volontaires qui apportent des réponses, qui ne perdront pas leur temps à lire tout un sujet pour se rendre compte finalement qu'une solution à déjà été trouvée.
aieeeuuuuu 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 01h28.


 
 
 
 
Partenaires

Hébergement Web