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;)
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
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
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