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 :

concatenation de chaine dans un left outer join


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut concatenation de chaine dans un left outer join
    Bonjour
    est i l possbile de concaterner des chaines sur des conditions dans un join ?
    j ai essayé ceci mais ca marche pas vraiment
    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
    select distinct(ac.AC_categorie),ct.CT_INTITULE,
    	PRIXVEN=
    		case
    		when tc.tc_prix is not null then 'GAMME'
    		when ac.ac_prixven != 0 then convert(varchar(15),ac.ac_prixven)
    		when ac.ac_coef!=0 then convert(varchar(15),a.ar_prixach * ac.ac_coef)
    		when ac.ac_devise != 0 then ' '
    		else
    		  convert(varchar(15),a.ar_prixven)
    		end,	
     
    	COEF=
    		case
    		when ac.ac_coef!=0 then convert(varchar(15),ac.ac_coef)
    		when ac.ac_devise != 0 then ' '
    		else
    		  convert(varchar(15),a.ar_coef)
    		end,
    	ac_prixttc,tc.tc_prix,
     
    	REMISE=
    		case
    		when ac.ac_qtemont =0 then convert(varchar(15),ac.AC_Remise)
    		else
    		  'Gamme'
    		end,
    	ac.ac_arrondi,ac.ac_qtemont
    from f_artclient ac
    left join p_cattarif ct on ct.cbindice=ac.AC_categorie
    left outer join F_ARTICLE a on a.ar_ref=ac.ar_ref
    left outer join F_TARIFCOND tc on tc.ar_ref=ac.ar_ref  and CAST(('a0' + AC_categorie)AS VARCHAR(3)) = tc.TC_RefCF
     
    WHERE ac.ar_ref = 'COND' and AC_categorie > 0 
    	and ac.AC_categorie not in (select substring(tg2.TG_RefCF,2,2)from f_tarifgam tg2 
    	where ISNUMERIC(substring(tg2.TG_RefCF,2,2))=1 and tg2.ar_ref = ac.ar_ref)
    AC_categorie est de type small int .
    j ai l erreur suivante:
    Erreur de syntaxe lors de la conversion de la valeur varchar 'a0' vers une colonne de type de données smallint.

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    tu n'indique pas en revanche, le type de TC_refCF !

    Voici ta requête récrite proprement :

    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
    SELECT DISTINCT ac.AC_categorie,
           ct.CT_INTITULE,
           CASE
              WHEN tc.tc_prix is not null  then 'GAMME'
              WHEN ac.ac_prixven <> 0      then CAST(ac.ac_prixven AS varchar(15)
              WHEN ac.ac_coef    <>        then CAST(a.ar_prixach * ac.ac_coef AS varchar(15)
              WHEN ac.ac_devise  <> 0      then ' '
              ELSE                         CAST(a.ar_prixven AS varchar(15))
           END AS PRIXVEN,   
           CASE
              WHEN ac.ac_coef    <> 0 then CAST(ac.ac_coef AS varchar(15),)
              WHEN ac.ac_devise  <> 0 then ' '
              ELSE                        CAST(a.ar_coef, varchar(15))
           END AS COEF,
           ac_prixttc,tc.tc_prix,
           CASE
              WHEN ac.ac_qtemont = 0 then CAST(ac.AC_Remise, varchar(15))
              ELSE                        'Gamme'
           END AS REMISE,
           ac.ac_arrondi,ac.ac_qtemont
     
    FROM   f_artclient ac
           LEFT OUTER JOIN p_cattarif ct 
                ON ct.cbindice = ac.AC_categorie
           LEFT OUTER JOIN F_ARTICLE a 
                ON a.ar_ref=ac.ar_ref
           LEFT OUTER JOIN F_TARIFCOND tc 
                ON tc.ar_ref = ac.ar_ref  
                AND 'a0' + CAST(AC_categorie AS VARCHAR(3)) = CAST(tc.TC_RefCF AS VARCHAR(5))
     
    WHERE ac.ar_ref = 'COND' 
      AND AC_categorie > 0
      AND ac.AC_categorie not in (SELECT substring(tg2.TG_RefCF, 2, 2) 
                                  FROM   f_tarifgam tg2
                                  WHERE  ISNUMERIC(substring(tg2.TG_RefCF, 2, 2)) = 1
                                    AND  tg2.ar_ref = ac.ar_ref)
    de toute façon c'est au niveau du transtypage que cela pose problème !

    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
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut
    tg_refcf est de type varchar
    ...
    par contre elle marche pas ta requete
    Syntaxe incorrecte vers le mot clé 'WHEN'
    je suis en train de regarder pkoi mais pour l instant j ia pas trouvé je cherche ....

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut
    okioki en fait y avait qq tites erreurs a deux francs ca marche nikel merci Mr !!!
    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
    SELECT DISTINCT ac.AC_categorie,
           ct.CT_INTITULE,
     
           CASE
              WHEN tc.tc_prix is not null  then 'GAMME'
              WHEN ac.ac_prixven != 0      then CAST(ac.ac_prixven AS varchar(15))
              WHEN ac.ac_coef    != 0        then CAST(a.ar_prixach * ac.ac_coef AS varchar(15))
              WHEN ac.ac_devise  != 0      then ' '
              ELSE                         CAST(a.ar_prixven AS varchar(15))
           END as PRIXVEN,   
           CASE
              WHEN ac.ac_coef   !=  0 then CAST(ac.ac_coef AS varchar(15))
              WHEN ac.ac_devise  != 0 then ' '
              ELSE                        CAST(a.ar_coef AS varchar(15))
           END AS COEF,
           ac_prixttc,tc.tc_prix,
           CASE
              WHEN ac.ac_qtemont = 0 then CAST(ac.AC_Remise AS varchar(15))
              ELSE                        'Gamme'
           END AS REMISE,
           ac.ac_arrondi,ac.ac_qtemont
     
    FROM   f_artclient ac
           LEFT OUTER JOIN p_cattarif ct
                ON ct.cbindice = ac.AC_categorie
           LEFT OUTER JOIN F_ARTICLE a
                ON a.ar_ref=ac.ar_ref
           LEFT OUTER JOIN F_TARIFCOND tc
                ON tc.ar_ref = ac.ar_ref 
                AND 'a0' + CAST(AC_categorie AS VARCHAR(3)) = CAST(tc.TC_RefCF AS VARCHAR(5))
     
    WHERE ac.ar_ref = 'COND'
      AND AC_categorie > 0
      AND ac.AC_categorie not in (SELECT substring(tg2.TG_RefCF, 2, 2)
                                  FROM   f_tarifgam tg2
                                  WHERE  ISNUMERIC(substring(tg2.TG_RefCF, 2, 2)) = 1
                                    AND  tg2.ar_ref = ac.ar_ref)

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Pense au Tag [Résolu]

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

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

Discussions similaires

  1. Positionnement prédicat dans un LEFT OUTER JOIN
    Par rad_hass dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/06/2010, 16h30
  2. Problème dans left outer join
    Par aymen007 dans le forum SQL
    Réponses: 1
    Dernier message: 21/05/2008, 12h03
  3. [MySQL] left outer join et concaténation dans un tableau passe par if mais pas par else ?
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 08/04/2008, 15h09
  4. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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