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

Langage SQL Discussion :

Problème de syntaxe avec CASE WHEN


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut Problème de syntaxe avec CASE WHEN
    Bonjour,
    Si j'ôte le deuxième CASE...END, la requête marche...
    Mais avec le deuxième CASE...END (colonne TOTAL), le serveur me dit que la base ne connait pas les champs "ANC_NUM_STUCT" ni "NB_ABD".
    Ce sont des alias définis au préalable...
    Je sais que ma syntaxe n'est pas bonne, mais je ne trouve pas la solution.
    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
    SELECT 
    PA01 AS TYPE_ADH,
    PA03 AS ANC_NUM_STUCT,
    COUNT(ADIDEN) AS NB_ADH,
    CASE 
    WHEN PA01='AD' THEN '15'
    WHEN PA01='FC' THEN '22,5'
    WHEN PA01='FS' THEN '22,5'
    WHEN PA01='PA' THEN '15'
    WHEN PA01='CS' THEN 'NON-PART_NAT'
    WHEN PA01='NA' THEN 'NON-PART_NAT'
    WHEN PA01='AB' THEN 'CETTE VENTE SERA FACTUREE'
    END AS UNITE_PART_NATIONALE,
    CASE WHEN PA01='AD' THEN UNITE_PART_NATIONALE*NB_ADH
    WHEN PA01='FC' THEN UNITE_PART_NATIONALE*NB_ADH
    WHEN PA01='FS' THEN UNITE_PART_NATIONALE*NB_ADH
    WHEN PA01='PA' THEN UNITE_PART_NATIONALE*NB_ADH
    WHEN PA01='CS' THEN '0'
    WHEN PA01='NA' THEN '0'
    WHEN PA01='AB' THEN 'A DETERMINER'
    END AS TOTAL
    FROM
    VUE_ADR AA,
    VUE_CODAD BB,
    VUE_ADHADM CC
    WHERE (AA.ADIDEN = CC.ADM_IDEN) AND (AA.ADIDEN = BB.COIDEN) 
    AND (ADM_DDU>'2014-12-31' AND PA03 LIKE '75%')
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Que dire de cette requête !?
    Les alias ne sont pas utilisables ici, car le moteur ne les appliquent "qu'à la fin" de l'exécution.
    Mais il y a plus grave, comme par exemple calculer le produit d'une chaine et d'un numérique, le fait que toutes les colonnes sans agrégation ne soient pas dans la clause GROUP-BY, les colonnes dans nom de table...

    Tatayo.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    OK, je comprends mon erreur.
    Merci,
    Mais comment faire pour construire la colonne total ?
    Elle doit être le produit de le la colonne UNITE_PART_NATIONALE * la valeur de la colonne NB_ADH.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Les jointures se font avec JOIN / ON et non dans le WHERE et cela depuis 1992, soit 23 ans... Peut être devriez vous vous recycler !!!

    Sinon pour le reste :

    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
    SELECT  PA01 AS TYPE_ADH,
            PA03 AS ANC_NUM_STUCT,
            COUNT(ADIDEN) AS NB_ADH,
            CASE 
               WHEN PA01 IN ('AD', 'PA') THEN '15'
               WHEN PA01 IN ('FC', 'FS') THEN '22,5'
               WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
               WHEN PA01 ='AB'           THEN 'CETTE VENTE SERA FACTUREE'
            END AS UNITE_PART_NATIONALE,
            CASE 
    		   WHEN PA01 IN ('AD', 'FC', 'FS', 'PA') THEN UNITE_PART_NATIONALE * COUNT(ADIDEN)
               WHEN PA01 IN ('CS', 'NA') THEN '0'
               WHEN PA01 ='AB' THEN 'A DETERMINER'
            END AS TOTAL
    FROM    VUE_ADR AA
            INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
    		INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
    WHERE   ADM_DDU > '2014-12-31' 
      AND   PA03 LIKE '75%')
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03
    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/ * * * * *

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    La solution de SQLPRO me semble très satisfaisante, toutefois, il faut savoir ne pas tout demander à une requête, le programme a le droit de faire aussi des calculs hors requête, et dans ce cas précis, ça peut aussi être la solution, pensons à la maintenance

    Pour la même raison j'abonde dans le sens de SQLPRO : la séparation des critères de jointures (à placer dans les prédicats inner/outer join on) des critères de filtrage (qui eux sont dans le where) facilite la compréhension et donc la maintenance

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Les jointures se font avec JOIN / ON et non dans le WHERE et cela depuis 1992, soit 23 ans... Peut être devriez vous vous recycler !!!
    Sinon pour le reste :
    A +

    "Pour le reste" un grand merci !
    "Pour le recyclage" : j'ai commencé avec SQL il y a 3 jours ; mon soucis c'est de comprendre ...
    Je vais essayer votre solution et je vous tiendrai au courant

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Bon, mes amis, je suis de retour
    Le Code affiche la colonne "Total"
    On a fait un pas en avant; cependant la multiplication ne se produit pas
    Je reçois deux messages différents
    A. "Le champ UNITE_PART_NATIONALE (un alias) n'est pas dans la table"
    B. "La conversion ne peut pas se faire"

    J'ai mit une chaine de caractères 'A FINIR' à la place de la multiplication souhaitée : UNITE_PART_NATIONALE * COUNT(ADIDEN), et dans cette situation non conflictive , le code fonctionne bien.



    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
    SELECT 
    PA01 AS TYPE_ADH,
    PA03 AS ANC_NUM_STUCT,
    COUNT(ADIDEN) AS NB_ADH,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN '15'
    WHEN PA01 IN ('FC', 'FS') THEN '22,5'
    WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
    WHEN PA01 ='AB' THEN 'CETTE VENTE SERA FACTUREE'
    END AS UNITE_PART_NATIONALE,
    CASE
    WHEN PA01 IN ('AD', 'FC', 'FS', 'PA') THEN 'À FINIR'
    WHEN PA01 IN ('CS', 'NA') THEN '0'
    WHEN PA01 ='AB' THEN 'A DETERMINER'
    END AS TOTAL
    FROM
    VUE_ADR AA
    INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
    INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
    WHERE
    ADM_DDU > '2014-12-31' AND PA03 LIKE '75%'
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Quel est votre SGBD ?
    Donnez le descriptif de vos table sous forme DDL (CREATE TABLE....)...

    EN cela vous vous conformerez aux règles de postage : http://www.developpez.net/forums/a69...gage-sql-lire/

    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/ * * * * *

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut SGBD
    Pardon pour la réponse tardive, mais la recherche de l'information demandée m'a pris du temps.
    Le serveur SGBD héberge un base de données MS SQL 2012.
    Résultat souhaité :
    Nom : RésultatCapture.PNG
Affichages : 253
Taille : 5,0 Ko

  10. #10
    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,

    De la même façon que NB_ADH, UNITE_PART_NATIONALE ne peut être utilisé dans la requête à ce niveau.

    Soit vous procédez de la même façon pour cette (future) colonne qu'avec NB_ADH/COUNT(ADIDEN),

    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
     
    SELECT 
    PA01 AS TYPE_ADH,
    PA03 AS ANC_NUM_STUCT,
    COUNT(ADIDEN) AS NB_ADH,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN '15'
    WHEN PA01 IN ('FC', 'FS') THEN '22,5'
    WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
    WHEN PA01 ='AB' THEN 'CETTE VENTE SERA FACTUREE'
    END AS UNITE_PART_NATIONALE,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 15 * COUNT(ADIDEN)
    WHEN PA01 IN ('FC', 'FS') THEN 22,5 * COUNT(ADIDEN)
    WHEN PA01 IN ('CS', 'NA') THEN '0'
    WHEN PA01 ='AB' THEN 'A DETERMINER'
    END AS TOTAL
    FROM
    VUE_ADR AA
    INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
    INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
    WHERE
    ADM_DDU > '2014-12-31' AND PA03 LIKE '75%'
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03


    soit vous passez par une CTE ou une pseudo table pour factoriser le code :
    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
     
    WITH CTE AS (
        SELECT 
        PA01 AS TYPE_ADH,
        PA03 AS ANC_NUM_STUCT,
        COUNT(ADIDEN) AS NB_ADH,
        CASE
        WHEN PA01 IN ('AD', 'PA') THEN '15'
        WHEN PA01 IN ('FC', 'FS') THEN '22,5'
        WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
        WHEN PA01 ='AB' THEN 'CETTE VENTE SERA FACTUREE'
        END AS UNITE_PART_NATIONALE,
        FROM
        VUE_ADR AA
        INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
        INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
        WHERE
        ADM_DDU > '2014-12-31' AND PA03 LIKE '75%'
        GROUP BY BB.PA01, BB.PA03 
        ORDER BY BB.PA01, BB.PA03
    )
    SELECT 
        TYPE_ADH
        ,ANC_NUM_STUCT
        ,NB_ADH
        ,UNITE_PART_NATIONALE
        ,CASE
            WHEN PA01 IN ('AD', 'FC', 'FS', 'PA') THEN NB_ADH * UNITE_PART_NATIONALE
            WHEN PA01 IN ('CS', 'NA') THEN '0'
        WHEN PA01 ='AB' THEN 'A DETERMINER'
        END AS TOTAL
    FROM CTE

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    un grand merci pour les réponses ! super claires !
    Mais il reste un petite qqch avec cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 15 * COUNT(ADIDEN)
    WHEN PA01 IN ('FC', 'FS') THEN 22,5 * COUNT(ADIDEN)
    WHEN PA01 IN ('CS', 'NA') THEN '0'
    WHEN PA01 ='AB' THEN 'A DETERMINER'
    END AS TOTAL
    Ce code demande à la colonne total porte parfois des caractères numériques parfois des strings..et cela semble ne pas marcher
    je reçois le message 'conversion impossible'
    Par contre, si je modifie le code , et sur toute la colonne je demande des valeurs numériques : alors ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 15 * COUNT(ADIDEN)
    WHEN PA01 IN ('FC', 'FS') THEN 22,5 * COUNT(ADIDEN)
    WHEN PA01 IN ('CS', 'NA') THEN 0
    WHEN PA01 ='AB' THEN 0
    END AS TOTAL
    De même si le code demande toujours des strings : cela marche aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 'A'
    WHEN PA01 IN ('FC', 'FS') THEN 'B'
    WHEN PA01 IN ('CS', 'NA') THEN 'C'
    WHEN PA01 ='AB' THEN 'D'
    END AS TOTAL
    Il y a un problème de conversion , de toute évidence, que je ne sais pas si il s'agit d'une limite de sql, je ne crois pas, ou un limite de mes connaissances : cela c'est plus sûr !

    mais tout va bien : je vois la lumière au fond du tunel...

  12. #12
    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
    Je me rends compte qu'il y a une erreur dans ma requête : il faut utiliser le point comme séparateur décimal.

    Par ailleurs, il serait préférable de transtyper explicitement le résultat des calculs afin d'éviter les ambiguïtés...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    transtyper explicitement le résultat des calculs
    A.
    OK pour la construction des décimaux avec le point

    B.
    transtyper ? c'est à dire ?

  14. #14
    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
    convertir explicitement en VARCHAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHEN PA01 IN ('FC', 'FS') THEN CAST(22.5 * COUNT(ADIDEN) AS VARCHAR)

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    J'ai relancé la requête avec le point mais le problème reste.
    Message : "la conversion de caractères n'est pas possible".

    Le problème de fond reste : il se passe qqch qui empêche la conversion de caractères : numériques quand il le faut, strings quand il le faut....

    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
    SELECT 
    PA01 AS TYPE_ADH,
    PA03 AS ANC_NUM_STUCT,
    COUNT(ADIDEN) AS NB_ADH,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN '15'
    WHEN PA01 IN ('FC', 'FS') THEN '22,5'
    WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
    WHEN PA01 ='AB' THEN 'CETTE VENTE SERA FACTUREE'
    END AS UNITE_PART_NATIONALE,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 15 * COUNT(ADIDEN)
    WHEN PA01 IN ('FC', 'FS') THEN 22.5 * COUNT(ADIDEN)
    WHEN PA01 IN ('CS', 'NA') THEN '0'
    WHEN PA01 ='AB' THEN 'A DETERMINER'
    END AS TOTAL
    FROM
    VUE_ADR AA
    INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
    INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
    WHERE
    ADM_DDU > '2014-12-31' AND PA03 LIKE '75%'
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    convertir explicitement en VARCHAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHEN PA01 IN ('FC', 'FS') THEN CAST(22.5 * COUNT(ADIDEN) AS VARCHAR)
    Je ne comprends pas cette réponse : 22.5 * COUNT(ADIDEN) sera toujours numérique
    et 'A DETERMINER' sera toujours string

    c'est la construction alternative ; une fois l'une , l'autre fois l'autre qui semble ne pas marcher.....

    Comme j'ai explique si le code demande traiter tous les enregistrements de la colonne TOTAL comme string : ça marche
    De même si le code demande traiter tous les enregistrements de la colonne TOTAL comme décimaux : ça marche aussi

  17. #17
    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
    Citation Envoyé par Lord_Chesseling Voir le message
    Je ne comprends pas cette réponse : 22.5 * COUNT(ADIDEN) sera toujours numérique
    et 'A DETERMINER' sera toujours string
    En effet. Mais du coup... quel devrait être le type de la colonne résultante, TOTAL en l’occurrence ?

    C'est bien là qu'est le problème : le type renvoyé par une structure CASE WHEN est le type ayant la plus forte précédence parmi tous les types possibles en retour.
    Dans votre cas, il s'agit du DECIMAL, puisque celui-ci à une plus forte précédence que VARCHAR.
    C'est donc lors du transtypage implicite de VARCHAR vers DECIMAL que vous avez cette erreur, SQL Server ne parvenant pas a transtyper 'A DETERMINER' en DECIMAL.

    Il faut donc transtyper explicitement votre DECIMAL en VARCHAR, afin d'éviter le transtypage implicite inverse qui ne fonctionnera pas.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    le type renvoyé par une structure CASE WHEN est le type ayant la plus forte précédence parmi tous les types possibles en retour.
    Si les choses sont comme ça, alors il ne me gêne pas rester en décimal comme valeur 'la plus forte' pour la colonne 'TOTAL'
    Le code suivant fait l'affaire, et je considère la consultation résolue : mille mercis à l'équipe de Developpez.com

    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
    SELECT 
    PA01 AS TYPE_ADH,
    PA03 AS ANC_NUM_STUCT,
    COUNT(ADIDEN) AS NB_ADH,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN '15'
    WHEN PA01 IN ('FC', 'FS') THEN '22,5'
    WHEN PA01 IN ('CS', 'NA') THEN 'NON-PART_NAT'
    WHEN PA01 ='AB' THEN 'CETTE VENTE SERA FACTUREE'
    END AS UNITE_PART_NATIONALE,
    CASE
    WHEN PA01 IN ('AD', 'PA') THEN 15 * COUNT(ADIDEN)
    WHEN PA01 IN ('FC', 'FS') THEN 22.5 * COUNT(ADIDEN)
    WHEN PA01 IN ('CS', 'NA') THEN 0
    WHEN PA01 ='AB' THEN 0
    END AS TOTAL
    FROM
    VUE_ADR AA
    INNER JOIN VUE_CODAD BB ON AA.ADIDEN = BB.COIDEN
    INNER JOIN VUE_ADHADM CC ON AA.ADIDEN = CC.ADM_IDEN
    WHERE
    ADM_DDU > '2014-12-31' AND PA03 LIKE '75%'
    GROUP BY BB.PA01, BB.PA03 
    ORDER BY BB.PA01, BB.PA03

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

Discussions similaires

  1. Problème avec case when
    Par kodo dans le forum Développement
    Réponses: 5
    Dernier message: 20/12/2011, 15h35
  2. Syntaxe SELECT CASE WHEN avec Microsoft.ACE.OLEDB.12.0
    Par kluh dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/12/2010, 09h59
  3. Problème de syntaxe avec le composant TCppWebBrowser
    Par Ptite Développeuse dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/04/2006, 15h48
  4. problème de syntaxe avec champ date
    Par mussara dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 16h19
  5. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20

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