SELECTでCASEステートメントを使用したいと思います。
ユーザーテーブルから選択し、(1つの属性として)ネストされたSQLも使用します。
SELECT
registrationDate,
(SELECT COUNT(*) FROM Articles WHERE userId = Users.userId) as articleNumber,
hobbies, ...
FROM USERS
次に、CASEステートメントを実行してユーザーのランクを取得します(ランクはarticleNumberに依存します)。
私はこのようにしてみました:
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
解析ではエラーは表示されませんが、実行しようとするとエラーが発生します。
メッセージ207、レベル16、状態1、プロシージャGetUserList、行XY
無効な列名「articleNumber」。
CASEはネストされたSELECTを「認識」しません。
SQL Server 2008-Case/SELECT句のIfステートメント のような他のソリューションで手伝いましたが、何も機能しないようです。
また、「<」と「>」の比較で同様の問題は見つかりませんでした。
どんな助けも大歓迎です;)
外側の選択で同じものを選択してください。同じクエリでエイリアス名にアクセスすることはできません。
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
する必要があります:
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
これで試すことができます:
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