Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Filtrer des tuples


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Filtrer des tuples
    Bonjour

    Suite à une requête avec un UNION j'obtiens une liste d'articles en fonction de mes critères. Cependant dans ce résultat j'ai des articles que je retrouve deux fois et c'est pas vraiment des doublons car pas identique sur toutes les colonnes.

    Voici un exemple de deux tuples presque identique :




    Pour explique le résultat : pour un même client 1 et un même code_article A1 deux tarifs peuvent s'appliquer comme c'est le cas ici.

    Lorsque je suis dans ce cas de figure ci, je dois appliquer une règle de priorité qui est de retenir le tuple dont le champ tarif_avance est renseigné.

    Donc, sur toute ma liste d'article je cherche à réaliser en SQL Server une condition pour garder bien évidemment les articles qui n'ont pas de tarif_avance, et dans le cas ou un article est en 'doublon' garder seulement l'article qui à le tarif_avance de renseigner et exclure de la liste de résultat l'autre article.

    J'espère avoir été clair. Merci d'avance du coup de main!

  2. #2
    Rédacteur

    Utilisez la fonction COALESCE ou l'opérateur CASE pour synthétiser ces deux colonnes.

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Candidat au Club
    J'ai essayé le CASE hier mais sans succès, j'ai du mal m'y prendre.
    Je dois dire que lorsque deux tuples ont le champ code_article (identique) ALORS je sélectionne uniquement celui avec le champ tarif_renseigné et quand y'a pas de code_article identique je sélectionne le tuple. Je vais essayer de le traduire en SQL désormais, merci @SQLpro !

  4. #4
    Candidat au Club
    C'est ma requête de départ, le premier SELECT me récupère les quelques articles ayant un yts_tarifspecial de renseigné et donc le champ yts_tariftiers est forcement vide (pas null) // le second SELECT me récupère les articles n'ayant PAS de yts_tarifspecial donc champ vide et le champ yts_tariftiers est renseigné.
    Mais les articles avec un tarif spécial sont également dans le second select car il existe une version d'article qui n'ont pas de tarif spécial. Et je veux garder seulement les articles avec le tarif spécial car des champs prixnet / prixbrut change forcement.
    J'ai essayé de traduire cette requête avec COALESCE mais j'obtiens bien trop de lignes, environ 430K..

    La seule différence entre les deux SELECT est au niveau de la jointure de YTARIFS, le reste est strictement identique.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT T_TIERS, T_TARIFTIERS, YTC_TARIFSPECIAL, GA_CODEARTICLE, YTS_TARIFTIERS, YTS_TARIFSPECIAL, GA_LIBELLE, GA_FAMILLENIV1, GA_FAMILLENIV2, GA_FAMILLENIV3,
    YTS_PRIXNET, YTS_PRIXBRUT, YTS_REMISE1, YTS_REMISE2, YTS_REMISE3, YTS_FAMILLENIV1, YTS_FAMILLENIV2,
    YTS_FAMILLENIV3, YTS_DATEFIN
    FROM TIERS
    LEFT JOIN TIERSCOMPL on TIERSCOMPL.YTC_AUXILIAIRE = TIERS.T_AUXILIAIRE
    LEFT JOIN YTARIFS on  TIERSCOMPL.YTC_TARIFSPECIAL = YTARIFS.YTS_TARIFSPECIAL
    LEFT JOIN ARTICLE on ARTICLE.GA_CODEARTICLE = YTARIFS.YTS_CODEARTICLE
    WHERE T_TIERS = '010007'AND GA_FERME != 'X' AND GA_LIBREART3 = 003 AND GA_LIBREART2 = 002 AND YTS_DATEFIN > getdate()
    UNION
    SELECT T_TIERS, T_TARIFTIERS,YTC_TARIFSPECIAL,GA_CODEARTICLE, YTS_TARIFTIERS, YTS_TARIFSPECIAL, GA_LIBELLE, GA_FAMILLENIV1, GA_FAMILLENIV2, GA_FAMILLENIV3,
    YTS_PRIXNET, YTS_PRIXBRUT, YTS_REMISE1, YTS_REMISE2, YTS_REMISE3, YTS_FAMILLENIV1, YTS_FAMILLENIV2,
    YTS_FAMILLENIV3, YTS_DATEFIN
    FROM TIERS
    LEFT JOIN TIERSCOMPL on TIERSCOMPL.YTC_AUXILIAIRE = TIERS.T_AUXILIAIRE
    LEFT JOIN YTARIFS on  TIERS.T_TARIFTIERS = YTARIFS.YTS_TARIFTIERS
    LEFT JOIN ARTICLE on ARTICLE.GA_CODEARTICLE = YTARIFS.YTS_CODEARTICLE
    WHERE T_TIERS = '010007' AND GA_FERME != 'X' AND GA_LIBREART3 = 003 AND GA_LIBREART2 = 002 AND YTS_DATEFIN > getdate()

  5. #5
    Modérateur

    bonjour,

    Vous pouvez joindre deux fois la meme table, il suffit de donner des alias différents.

    quelque chose comme :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T_TIERS, Y2.T_TARIFTIERS, Y1.YTC_TARIFSPECIAL, GA_CODEARTICLE, YTS_TARIFTIERS, YTS_TARIFSPECIAL, GA_LIBELLE, GA_FAMILLENIV1, GA_FAMILLENIV2, GA_FAMILLENIV3,
    YTS_PRIXNET, YTS_PRIXBRUT, YTS_REMISE1, YTS_REMISE2, YTS_REMISE3, YTS_FAMILLENIV1, YTS_FAMILLENIV2,
    YTS_FAMILLENIV3, YTS_DATEFIN
    FROM TIERS
    LEFT JOIN TIERSCOMPL on TIERSCOMPL.YTC_AUXILIAIRE = TIERS.T_AUXILIAIRE
    LEFT JOIN YTARIFS Y1 on  TIERSCOMPL.YTC_TARIFSPECIAL = Y1.YTS_TARIFSPECIAL
    LEFT JOIN YTARIFS Y2 on  TIERS.T_TARIFTIERS = Y2.YTS_TARIFTIERS AND Y1.Y1.YTS_TARIFSPECIAL IS NULL
    LEFT JOIN ARTICLE on ARTICLE.GA_CODEARTICLE = YTARIFS.YTS_CODEARTICLE
    WHERE T_TIERS = '010007'AND GA_FERME != 'X' AND GA_LIBREART3 = 003 AND GA_LIBREART2 = 002 AND YTS_DATEFIN > getdate()


    a adapter sans doute, car vous n'avez pas posté la structure de vos tables (on ne sait pas de quelle table viennent quelles colonnes) et vous n'avez pas clairement indiqué le résultat attendu... en focntion de celui-ci précisément, il y aura peut être d'autres solutions

  6. #6
    Membre éclairé
    Bonjour,

    Pour gérer une notion de priorité ici on peut utiliser la fonction ROW_NUMBER sur le résultat de la requête:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    row_number() over (partition by T_TIERS, GA_CODEARTICLE order by YTC_TARIFSPECIAL) as RN


    et ensuite tu filtres en utilisant ce résultat avec RN = 1.

  7. #7
    Membre confirmé
    Bonsoir,

    Vu que SQLpro vous a déjà donné une solution, et si vous souhaitez une alternative, je ne peux que vous recommander de créer un référentiel normalisé Clients-articles pour vous éviter ce genre de galères. On ne répètera jamais assez de privilégier avant tout la qualité de vos données au sein de votre référentiel.

###raw>template_hook.ano_emploi###