+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Nouveau Membre du Club
    Inscrit en
    septembre 2006
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 96
    Points : 27
    Points
    27

    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.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 3 226
    Points : 5 972
    Points
    5 972

    Par défaut

    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

  3. #3
    Nouveau Membre du Club
    Inscrit en
    septembre 2006
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 96
    Points : 27
    Points
    27

    Par défaut

    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.

  4. #4
    Nouveau Membre du Club
    Inscrit en
    septembre 2006
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 96
    Points : 27
    Points
    27

    Par défaut

    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.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 3 226
    Points : 5 972
    Points
    5 972

    Par défaut

    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

  6. #6
    Nouveau Membre du Club
    Inscrit en
    septembre 2006
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 96
    Points : 27
    Points
    27

    Par défaut

    Merci énormément, ça fonctionne

    Je vous souhaite une agréable journée.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •