SQL 如何对 Case 语句形成的两个字段进行平均

SQL How to average two fields formed by a Case Statement

这是我的查询。我有两个推荐人,他们有自己的排名。我需要使用 CASE 语句将排名转换为数字,然后对这两个数字进行平均。当我 运行 查询时,我得到“无效的列名错误”。如果我注释掉 averageScore 字段,CASE 语句将按预期工作。

 select 
    (select [name] from [user] where ([id] = rf_reverse_d1b6_1.[user])) as [Name - Reviewer 1], 
    (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) as [Recommendation - Reviewer 1], 
    (select [name] from [user] where ([id] = rf_reverse_d1b6_2.[user])) as [Name - Reviewer 2], 
    (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) as [Recommendation - Reviewer 2], 
    
 --converting reviewer 1 scores
    (CASE WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'High Recommend' Then 3
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Recommmend' Then 2
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Low Recommend' Then 1
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Not Recommended' Then 0
 ELSE 111
 END) AS [Reviewer_1_Score],
 --converting reviewer 2 scores
    (CASE WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'High Recommend' Then 3
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Recommmend' Then 2
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Low Recommend' Then 1
     WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Not Recommended' Then 0
 ELSE 222
 END) AS [Reviewer_2_Score],
 --average both scores
    (([Reviewer_1_Score] + [Reviewer_2_Score])/2) as [AvgerageScore]
 
 from [application] a
 inner join [person] p on (p.[id] = a.[person])
 left outer join [lookup.round] r on (r.[id] = a.[round])
 left outer join [form.response] rf_reverse_d1b6_1 on (rf_reverse_d1b6_1.[record] = a.[id]) 
 and rf_reverse_d1b6_1.[user] In (select u1.[id] from [user] u1 where (select [value] from dbo.getFieldTopTable(u1.[id], 'user_panelist_number')) = 1)
 left outer join [form.response] rf_reverse_d1b6_2 on (rf_reverse_d1b6_2.[record] = a.[id])
 and rf_reverse_d1b6_2.[user] In (select u2.[id] from [user] u2 where (select [value] from dbo.getFieldTopTable(u2.[id], 'user_panelist_number')) = 2)

根据您的语法,我假设您正在使用 MS SQL。在那种情况下,您不能在另一列中引用 column_alias

column_alias can be used in an ORDER BY clause. However, it cannot be used in a WHERE, GROUP BY, or HAVING clause. If the query expression is part of a DECLARE CURSOR statement, column_alias cannot be used in the FOR UPDATE clause.

我认为使用 CTE:

解决这个问题相对容易
WITH data_table AS
(
     select 
        (select [name] from [user] where ([id] = rf_reverse_d1b6_1.[user])) as [Name - Reviewer 1], 
        (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) as [Recommendation - Reviewer 1], 
        (select [name] from [user] where ([id] = rf_reverse_d1b6_2.[user])) as [Name - Reviewer 2], 
        (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) as [Recommendation - Reviewer 2],   
     --converting reviewer 1 scores
        (CASE WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'High Recommend' Then 3
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Recommmend' Then 2
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Low Recommend' Then 1
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_1.[id], 'nsf_app_scr_recommendtion')) = 'Not Recommended' Then 0
     ELSE 111
     END) AS [Reviewer_1_Score],
     --converting reviewer 2 scores
        (CASE WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'High Recommend' Then 3
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Recommmend' Then 2
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Low Recommend' Then 1
         WHEN (select [value] from dbo.getFormResponseTable(rf_reverse_d1b6_2.[id], 'nsf_app_scr_recommendtion')) = 'Not Recommended' Then 0
     ELSE 222
     END) AS [Reviewer_2_Score]
     from [application] a
     inner join [person] p on (p.[id] = a.[person])
     left outer join [lookup.round] r on (r.[id] = a.[round])
     left outer join [form.response] rf_reverse_d1b6_1 on (rf_reverse_d1b6_1.[record] = a.[id]) 
     and rf_reverse_d1b6_1.[user] In (select u1.[id] from [user] u1 where (select [value] from dbo.getFieldTopTable(u1.[id], 'user_panelist_number')) = 1)
     left outer join [form.response] rf_reverse_d1b6_2 on (rf_reverse_d1b6_2.[record] = a.[id])
     and rf_reverse_d1b6_2.[user] In (select u2.[id] from [user] u2 where (select [value] from dbo.getFieldTopTable(u2.[id], 'user_panelist_number')) = 2)
)
SELECT *
 --average both scores
,(([Reviewer_1_Score] + [Reviewer_2_Score])/2) as [AvgerageScore]
FROM data_table