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

Développement SQL Server Discussion :

Avoir une seule valeur pour un Champ donné


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Avoir une seule valeur pour un Champ donné
    Bonjour,
    Je me trouve face à un problème. J'ai une requête avec certains champs calculés et j'aimerais n'avoir qu'un seul résultat pour un champ donné.
    Je vous donne la requête :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    SELECT iif ((MAJDILICOM.dbo.fichier_dilicom.taux_tva2  <> ''), MAJDILICOM.dbo.fichier_dilicom.EAN13_art+'TVA1',MAJDILICOM.dbo.fichier_dilicom.EAN13_art) as codearticle,
    REPLACE(RTRIM (MAJDILICOM.dbo.fichier_dilicom.lib_etendu),Char(34),'') AS Designation,
    'LIBRAIRIE' AS Famille,
    LEFT(MAJDILICOM.dbo.FamilleClilThèmeComplet.SousFamille,50) AS SousFamille,
    '1' AS Qte_mini,
    'N' AS multiple_qte,
    rtrim(MAJDILICOM.dbo.fichier_dilicom.ref_four) AS codebarre,
    'N' AS report_famille,
    CodeTva.codetva AS tvanat,
    REPLACE(ROUND(CAST(CONVERT(float, fichier_dilicom.montant_ht1) / 1000 AS decimal(6, 2)), 2), '.', ',')AS PA,
    /*REPLACE(ROUND(CAST(CONVERT(float, fichier_dilicom.montant_ht1) / 1000 AS decimal(6, 2)), 2), '.', ',') AS PA,*/
    IIf(MAJDILICOM.dbo.fichier_dilicom.[collection] Is Not Null,Replace(MAJDILICOM.dbo.fichier_dilicom.[collection],Char(34),''), NULL) AS Collection,
    iif (Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Catégorie],50)is NULL,'',Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Catégorie],50)) AS Cat,
    iif (Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Classe],50)is NULL,'',Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Classe],50)) AS Cla,
    iif (Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Nature],50)is NULL,'',Left(MAJDILICOM.dbo.FamilleClilThèmeComplet.[Nature],50)) AS Nat,
    Replace(MAJDILICOM.dbo.fichier_dilicom.[editeur],Char(34),'') AS MarqueEditeur,
    IIf(MAJDILICOM.dbo.fichier_dilicom.[code_mouv]='S','N','O') AS Actif,
    iif(MAJDILICOM.dbo.fichier_dilicom.[epaisseur] ='    ','0',MAJDILICOM.dbo.fichier_dilicom.[epaisseur]) AS Longueur,
    iif(MAJDILICOM.dbo.fichier_dilicom.[largeur] ='    ','0',MAJDILICOM.dbo.fichier_dilicom.[largeur]) AS Largeur,
    iif(MAJDILICOM.dbo.fichier_dilicom.[hauteur] ='    ','0',MAJDILICOM.dbo.fichier_dilicom.[hauteur]) AS Hauteur,
    '0,001000000' AS UnitéMesure,
    iif(MAJDILICOM.dbo.fichier_dilicom.[poids] ='    ','0', MAJDILICOM.dbo.fichier_dilicom.[poids] )AS Poids,
    '1' AS UnitéPoids,
    fichier_dilicom.commandable,
    iif(MAJDILICOM.dbo.CodeRetour.libellé is NULL,'', MAJDILICOM.dbo.CodeRetour.libellé) AS CodeRetour,
    IIf(MAJDILICOM.dbo.fichier_dilicom.[coll_serielle] Is Not Null,Replace(MAJDILICOM.dbo.fichier_dilicom.[coll_serielle],Char(34),''),'') AS CollectionSerielle,
    Replace(MAJDILICOM.dbo.fichier_dilicom.[auteur],Char(34),'') AS Auteur,
    CodeDispo.libellé,
    CodeTva.codetva AS tvacomptoir,
    CodeTva.codetva AS tvacee,
    CodeTva.codetva AS tvaexp,
    CodeTva.codetva AS tvadiv,
    CodeTva.CompteVente AS cptnat,
    CodeTva.CompteVente AS cptcomptoir,
    CodeTva.CompteVente AS cptcee,
    CodeTva.CompteVente AS cptexp,
    CodeTva.CompteVente AS cptdiv,
    'O' AS autvent,
    'S' AS modstk,
    'O' AS esc,
    'O' AS com,
    'O' AS rem,
    'O' AS stat,
    'O' AS stock,
    MAJDILICOM.dbo.fichier_dilicom.isbn_article AS ISBN,
    IIf(MAJDILICOM.dbo.fichier_dilicom.taux_tva2 <>'',concat(MAJDILICOM.dbo.fichier_dilicom.EAN13_art,'TVA2'),'') AS ArtSuiv,
    REPLACE(RTRIM (MAJDILICOM.dbo.fichier_dilicom.libelle),Char(34),'') AS designation2,
    '' AS description,
    iif(MAJDILICOM.dbo.fichier_dilicom.eau_produit_lie is null , '',MAJDILICOM.dbo.fichier_dilicom.eau_produit_lie) AS Artremplacement,
    iIf(MAJDILICOM.dbo.fichier_dilicom.code_mouv='S','O','N') AS SupDilicom,
    IIf(MAJDILICOM.dbo.fichier_dilicom.date_fin_com Is Null Or MAJDILICOM.dbo.fichier_dilicom.date_fin_com='','01/01/1900',Right(MAJDILICOM.dbo.fichier_dilicom.date_fin_com,2) + '/' + right(left(MAJDILICOM.dbo.fichier_dilicom.date_fin_com,6),2) + '/' + Left(MAJDILICOM.dbo.fichier_dilicom.date_fin_com,4)) AS DateFinCom,
    iif (MAJDILICOM.dbo.fichier_dilicom.[impression_demande]='1','O','N') AS ImpressionDemande,
    iif ((MAJDILICOM.dbo.fichier_dilicom.[impression_demande]='1' OR MAJDILICOM.dbo.fichier_dilicom.[eau_produit_lie] <> ''),'O','N') AS Alerte,
    iif (MAJDILICOM.dbo.fichier_dilicom.[impression_demande]='1','ATTENTION : Titre en impression à la demande',iif (MAJDILICOM.dbo.fichier_dilicom.[eau_produit_lie] <> '','ATTENTION : Titre remplacé par '+MAJDILICOM.dbo.fichier_dilicom.eau_produit_lie,'')) AS AlerteMessage,
    iif ((MAJDILICOM.dbo.fichier_dilicom.[eau_produit_lie] <> '' OR MAJDILICOM.dbo.CodeDispo.libellé='arrêt définitif de commercialisation'),'N','O') as SitePart,
    iif ((MAJDILICOM.dbo.fichier_dilicom.[eau_produit_lie] <> '' OR MAJDILICOM.dbo.CodeDispo.libellé='arrêt définitif de commercialisation'),'N','O') as SiteEcole,
    iif ((MAJDILICOM.dbo.fichier_dilicom.[eau_produit_lie] <> '' OR MAJDILICOM.dbo.CodeDispo.libellé='arrêt définitif de commercialisation'),'N','O') as EnLigne
    FROM            CodeDispo INNER JOIN
                             fichier_dilicom ON CodeDispo.code = fichier_dilicom.code_dispo INNER JOIN
                             FamilleClilThèmeComplet ON fichier_dilicom.theme = FamilleClilThèmeComplet.Thème INNER JOIN
                             CodeTva ON fichier_dilicom.taux_tva1 = CodeTva.libellé INNER JOIN
                             CodeRetour ON fichier_dilicom.code_retour = CodeRetour.codeRetour
    WHERE        (fichier_dilicom.code_mouv <> 'S') AND (fichier_dilicom.GENCOD_distributeur <> '3130630000006') AND  (fichier_dilicom.type_produit = '01' OR (fichier_dilicom.type_produit = '02')) AND (fichier_dilicom.type_prix = '4') AND 
                             (fichier_dilicom.pres_magasin <> '03')  AND (fichier_dilicom.taux_tva1 <> '')  and CONVERT(datetime, fichier_dilicom.date_tarif) <= CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
    GROUP BY fichier_dilicom.EAN13_art, fichier_dilicom.lib_etendu, FamilleClilThèmeComplet.SousFamille, fichier_dilicom.ref_four, CodeTva.codetva, fichier_dilicom.collection, FamilleClilThèmeComplet.Catégorie, 
                             FamilleClilThèmeComplet.Classe, FamilleClilThèmeComplet.Nature, fichier_dilicom.editeur, fichier_dilicom.epaisseur, fichier_dilicom.largeur, fichier_dilicom.hauteur, fichier_dilicom.poids, 
                             fichier_dilicom.commandable, fichier_dilicom.auteur, CodeDispo.libellé, CodeRetour.libellé, fichier_dilicom.coll_serielle, CodeTva.CompteVente, fichier_dilicom.isbn_article, 
                             fichier_dilicom.libelle, fichier_dilicom.eau_produit_lie, fichier_dilicom.date_fin_com,fichier_dilicom.code_mouv,fichier_dilicom.impression_demande,fichier_dilicom.taux_tva2, fichier_dilicom.date_tarif, fichier_dilicom.montant_ht1
    						 having  CONVERT(datetime, fichier_dilicom.date_tarif) <= CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
    J'ai besoin de sélectionner qu'une seule fois le codearticle car dans le logiciel que je l'intègre, ce champ est la clé primaire. donc mon fichier ne doit pas contenir de doublons.

    La table à partir de laquelle j'extrais ces données peut avoir plusieurs fois le même code article et ceux sont les autres champs qui sont différents. Par contre dans les résultats de la requête exposée ce dessus, je ne dois avoir qu'un seul résultat par codearticle.
    J'ai déjà essayé d'ajouter DISTINCT dans mon SELECT mais ça ne change rien et je n'arrive pas à avoir qu'un seul champ dans le Group by.

    Auriez vous une idée?

    D'avance, merci pour votre aide.

    Julien

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Si un DISTINCT renvoie plusieurs lignes, cela signifie que les autres colonnes du SELECT renvoient des données différentes.
    Donc la question est: quelle ligne garder ? Quelles valeurs prendre pour les autres colonnes ?
    Une fois la réponse donnée, il "suffit" d'ajouter une fonction d'agrégation sur ces colonnes, et de regrouper sur le code article.

    Tatayo.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    Les autres champs ne sont pas forcément nécessaires car ils représentent des valeurs qui sont à l'heure actuelle pas exploitées complètement mais ceux sont principalement des valeurs de texte. L'idéal serait de prendre la première valeur trouvé dans la table (soit le plus petit id de la table(cette colonne n'est pas utilisé dans la requête)).

    Merci pour le retour

    Julien

Discussions similaires

  1. avoir une seule page pour faciliter le transfert
    Par a_karim_fr dans le forum z/OS
    Réponses: 9
    Dernier message: 28/09/2009, 14h13
  2. [MySQL] Modification d'une seule valeur dans 2 champs
    Par Equinoxe5 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2009, 15h13
  3. Réponses: 7
    Dernier message: 20/12/2006, 08h06
  4. Réponses: 7
    Dernier message: 01/02/2006, 15h49
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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