Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 15h47   #1
sdisp+
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 88
Points : 19
Points : 19
Par défaut Problème sur select

Bonjour.

J'ai un souci pour faire une requête sous Sql Serveur.

J'ai ceci:
ColonneA ColonneB ColonneC
AZERTY0101 1 2
AZERTY0101 1 3
AZERTY0101 1 4
AZERTY0101 1 5
AZERTY0101 1 6
AZERTY0101 1 7
AZERTY0101 1 8
AZERTY0101 1 9
AZERTY0101 2 11
AZERTY0101 3 14
AZERTY0101 3 15
AZERTY0202 1 2
AZERTY0202 2 5
AZERTY0202 2 6
AZERTY0202 3 9
AZERTY0202 3 10
AZERTY0202 4 13

et je voudrais ceci:
ColonneA ColonneB ColonneC ColonneD
AZERTY0101 1 2 1
AZERTY0101 1 3 0
AZERTY0101 1 4 0
AZERTY0101 1 5 0
AZERTY0101 1 6 0
AZERTY0101 1 7 0
AZERTY0101 1 8 0
AZERTY0101 1 9 0
AZERTY0101 2 11 1
AZERTY0101 3 14 1
AZERTY0101 3 15 0
AZERTY0202 1 2 1
AZERTY0202 2 5 1
AZERTY0202 2 6 0
AZERTY0202 3 9 1
AZERTY0202 3 10 0
AZERTY0202 4 13 1

Je souhaite donc avoir en ColonneD la valeur 1 pour chaque couple différent de ColonneA et ColonneB avec la valeur minimal de ColonneC et la valeur 0 le reste du temps.

Avec cette requête je n'ai que mes valeurs = 1
Code :
1
2
3
4
5
6
SELECT ColonneA,
ColonneB, 
MIN(ColonneC),
1 AS ColonneD
FROM maTable 
GROUP BY ColonneA, ColonneB
ColonneA ColonneB ColonneC ColonneD
AZERTY0101 1 2 1
AZERTY0202 1 2 1
AZERTY0202 2 5 1
AZERTY0202 3 9 1
AZERTY0202 4 13 1

Comme puis-je faire pour avoir les valeur en 0?

Merci.
sdisp+ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h35   #2
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 690
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 690
Points : 2 664
Points : 2 664
Bonjour,

Dans votre résultat attendu, pourquoi 0 pour ces deux lignes :
AZERTY0101 2 11 0
AZERTY0101 3 14 0

n'est-ce pas plutôt 1 ? (il n'y a pas de couple AZERTY0101/2 ayant une colonne C inférieurs a 11...)

Est-ce que cette requete vous donne ce que vous attendez ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT 
		ColonneA,
		ColonneB,
		ColonneC,
		CASE 
			WHEN RANK() OVER (
				PARTITION BY ColonneA,ColonneB 
				ORDER BY ColonneC
				) = 1 
				THEN 1
			ELSE 0
		END AS ColonneD
FROM	MaTable
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/01/2013, 17h18   #3
sdisp+
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 88
Points : 19
Points : 19
Effectivement, je me suis trompé dans mon exemple! Je l'ai corrigé.
Votre requête fonctionne à merveille, il faut vraiment que je boss sur les instructions Partition (et WITH...) avec lesquels j'ai des soucis!

Merci beaucoup.
Bonne soirée.
sdisp+ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h30   #4
sdisp+
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 88
Points : 19
Points : 19
Bonjour.

J'ai oublié de préciser que je dois exécuter cette requête sur un serveur 2005 (pas de problème) mais également sur un serveur 2000, qui ne reconnait pas la fonction RANK.
J'ai trouvé quelques exemple de contournement, mais n'arrive pas à les appliquer.

Pouvez-vous m'aider?
Cordialement.
sdisp+ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h43   #5
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 690
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 690
Points : 2 664
Points : 2 664
sans fonction fenêtrée, vous pouvez faire comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
SELECT 
		Ref.ColonneA,
		Ref.ColonneB,
		Ref.ColonneC,
		CASE 
			WHEN mini.ColonneA IS NULL THEN 0 
			ELSE 1 
		END AS ColonneD
FROM		MaTable AS Ref
LEFT JOIN	(
			SELECT 
				ColonneA,
				ColonneB,
				MIN(ColonneC) AS minC
			FROM	MaTable
			GROUP BY 
				ColonneA,
				ColonneB
			)mini
		ON	mini.ColonneA = Ref.ColonneA
		AND	mini.ColonneB = Ref.ColonneB
		AND	mini.minC = Ref.ColonneC
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h51   #6
sdisp+
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 88
Points : 19
Points : 19
Merci énormément, ça fonctionne

Je vous souhaite une agréable journée.
sdisp+ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h02.


 
 
 
 
Partenaires

Hébergement Web