web-dev-qa-db-fra.com

TSQL CASE avec si comparaison dans l'instruction SELECT

Je voudrais utiliser l'instruction CASE dans SELECT.

Je sélectionne dans la table utilisateur et (en tant qu'attribut), j'utilise également du code SQL imbriqué:

SELECT 
   registrationDate, 
   (SELECT COUNT(*) FROM Articles WHERE userId = Users.userId) as articleNumber, 
   hobbies, ...
FROM USERS

et ensuite je voudrais faire une instruction CASE pour obtenir le rang d'utilisateur (le rang dépend de l'articleNumber).

J'ai essayé comme ça:

SELECT 
   registrationDate, 
   (SELECT COUNT(*) FROM Articles WHERE Articles.userId = Users.userId) as articleNumber, 
   ranking =
      CASE
         WHEN articleNumber < 2 THEN 'AMA'
         WHEN articleNumber < 5 THEN 'SemiAma' 
         WHEN articleNumber < 7 THEN 'Good'  
         WHEN articleNumber < 9 THEN 'Better' 
         WHEN articleNumber < 12 THEN 'Best'
         ELSE 'Outstanding'
      END,
   hobbies, etc...
FROM USERS

L'analyse ne montre aucune erreur, mais lorsque j'essaie de l'exécuter, j'obtiens une erreur:

Msg 207, niveau 16, état 1, procédure GetUserList, ligne XY
Nom de colonne non valide 'articleNumber'.

CASE ne "reconnaît" pas mon SELECT imbriqué, je suppose.

Je me suis aidé avec d'autres solutions telles que SQL Server 2008 - Instructions Case/If dans la clause SELECT , Mais rien ne semble fonctionner.

Je n'ai pas non plus rencontré de problème similaire avec les comparaisons '<' et '>'.

Toute aide serait grandement appréciée;)

36
CyberHawk

S'il vous plaît sélectionner le même dans la sélection externe. Vous ne pouvez pas accéder au nom d'alias dans la même requête.

SELECT *, (CASE
        WHEN articleNumber < 2 THEN 'AMA'
        WHEN articleNumber < 5 THEN 'SemiAma' 
        WHEN articleNumber < 7 THEN 'Good'  
        WHEN articleNumber < 9 THEN 'Better' 
        WHEN articleNumber < 12 THEN 'Best'
        ELSE 'Outstanding'
        END) AS ranking 
FROM(
    SELECT registrationDate, (SELECT COUNT(*) FROM Articles WHERE Articles.userId = Users.userId) as articleNumber, 
    hobbies, etc...
    FROM USERS
)x
47
TechDo

Devrait être:

SELECT registrationDate, 
       (SELECT CASE
        WHEN COUNT(*)< 2 THEN 'AMA'
        WHEN COUNT(*)< 5 THEN 'SemiAma' 
        WHEN COUNT(*)< 7 THEN 'Good'  
        WHEN COUNT(*)< 9 THEN 'Better' 
        WHEN COUNT(*)< 12 THEN 'Best'
        ELSE 'Outstanding'
        END as a FROM Articles 
        WHERE Articles.userId = Users.userId) as ranking,
        (SELECT COUNT(*) 
        FROM Articles 
        WHERE userId = Users.userId) as articleNumber,
hobbies, etc...
FROM USERS
7
Justin

Vous pouvez essayer avec ceci: 

WITH CTE_A As (SELECT COUNT(*) as articleNumber,A.UserID  as UserID FROM Articles A
           Inner Join Users U
           on  A.userId = U.userId 
           Group By A.userId , U.userId   ),

B as (Select us.registrationDate,

      CASE
         WHEN CTE_A.articleNumber < 2 THEN 'AMA'
         WHEN CTE_A.articleNumber < 5 THEN 'SemiAma' 
         WHEN CTE_A.articleNumber < 7 THEN 'Good'  
         WHEN CTE_A.articleNumber < 9 THEN 'Better' 
         WHEN CTE_A.articleNumber < 12 THEN 'Best'
         ELSE 'Outstanding'
         END as Ranking,
         us.hobbies, etc...
         FROM USERS Us Inner Join CTE_A 
         on CTE_A.UserID=us.UserID)

Select * from B
0
Dia Agha