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
这是我的查询。我有两个推荐人,他们有自己的排名。我需要使用 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