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 :

Erreur dans l'alias de ma requéte


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Erreur dans l'alias de ma requéte
    bonjour a tous


    Qui peut m'aider SVP sur cette erreur j'arrive pas a s'avoir pourquoi l'alias ne fonctionne pas dans le clause where

    ci joint ma petit requête

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select
     	row_number() over(partition by Iban order by iban) as classement 
    		,rib = SUBSTRING(I2.IBAN,5,len(I2.IBAN))
    		,IBAN
    	--	,BIC = max(BIC)
    		from _import_Bic_IBAN I2
    		--group by 
    		--SUBSTRING(I2.IBAN,5,len(I2.IBAN))
    	--	,IBAN
       where 	classement    >1


    merci pour vos aides

  2. #2
    Rédacteur

    Les alias de colonne définis dans la clause SELECT ne sont utilisable que dans la clause ORDER BY.

    En effet l'ordre logique d'exécution d'une requête d’extraction est :
    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. SELECT
    6. ORDER BY

    De ce fait, les alias du SELECT ne sont visible que pour le ORDER BY.

    Vous devez donc récrire votre requête en utilisant l'expression et non l'alias.

    D'autre part les fonctions fenêtrées (celles ayant une clause OVER) ne peuvent apparaitre que dans la clause SELECT et en aucun cas dans les clauses WHERE ou HAVING, sinon cela changerait le calcul effectué par la fonction fenêtrée et donc le résultat de la requête (récursivité incontrôlable !)

    Pour filtrer le résultat d'une fonction fenêtrée vous devez utiliser une sous requête....

    À me lire : https://sqlpro.developpez.com/articl...window/#LIII-B

    Apprenez le langage SQL. Mon livre peut vous y aider :


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

  3. #3
    Membre expérimenté
    Bonjour,

    La réponse de SQLpro la bonne.

    Partant de :
    Citation Envoyé par samirCA007 Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select
     	row_number() over(partition by Iban order by iban) as classement 
    		,rib = SUBSTRING(I2.IBAN,5,len(I2.IBAN))
    		,IBAN
    	--	,BIC = max(BIC)
    		from _import_Bic_IBAN I2
    		--group by 
    		--SUBSTRING(I2.IBAN,5,len(I2.IBAN))
    	--	,IBAN
       where 	classement    >1

    On peut faire une sous requête pour, dans un premier temps nommer les colonnes puis, utiliser le nom des colonnes dans les clauses where ou group by.

    Le plus élégant étant avec une CTE :
    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
    ; 
    /* l'instruction pécédente DOIT se terminer par un ; avant une CTE */
    With Iban_Ordered as
            (select 
                 row_number() over(partition by Iban order by iban) as classement 
                ,SUBSTRING(I2.IBAN,5,len(I2.IBAN))                  as rib 
                ,IBAN                                               as iban
                ,BIC                                                as bic
            from _import_Bic_IBAN 
            )
     
        Select
             classement
            ,rib
            ,iban
            --,max(bic)
        From Iban_Ordered as IO
        where 1=1
            and classement    >1
            -- and ...
        -- Group By classement, rib, iban
        ;
    Le savoir est une nourriture qui exige des efforts.

###raw>template_hook.ano_emploi###