IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut 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 :

    Nom : Capture d’écran 2020-11-05 à 15.02.56.png
Affichages : 136
Taille : 30,3 Ko


    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

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Utilisez la fonction COALESCE ou l'opérateur CASE pour synthétiser ces deux colonnes.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    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

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    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é
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    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.

Discussions similaires

  1. Filtrer des champs vides
    Par pierrot67 dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/09/2006, 17h08
  2. [SimpleXML] Filtrer des balises grâce à leurs attributs
    Par tatayecorp dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 15/08/2006, 20h06
  3. Filtrer des données
    Par nes100 dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/05/2006, 14h53
  4. Comportement différent des listes [] et des tuples () ??
    Par JujuKéblo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/10/2005, 09h08
  5. [xslt] filtrer des valeurs numériques
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/09/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo