我有这个问题:
;with Employee_cte as(
Select e.*,(Select SUM(r.execoffice_status)
From intranet.dbo.CSEReduxResponses r
where e.emp_id = r.employee
AND MONTH(r.approveddate) = MONTH(GETDATE())) as TotalStars
From phonelist.dbo.employee e
)
Select Top 2 RANK() Over(Order by TotalStars DESC) AS EmployeeRank,*
From Employee_cte
如果没有平局,它会很有效(因为它给了我TOP 2)。我希望输出前2,但如果有一个平局,它会给我一个错误:变量AVERAGE_RATING_DEPT_RUNNERUP未定义
以下是我输出结果的地方。我怎样才能让它与领带一起工作?
<cfoutput query="getMaxstars">
<cfif EmployeeRank eq 1>
<cfset average_rating_max = TotalStars>
<cfset average_rating_dept = emp_namefirst>
<cfset average_rating_dept_last_name = emp_namelast>
</cfif>
<cfif EmployeeRank eq 2>
<cfset average_rating_max_runnerup = TotalStars>
<cfset average_rating_dept_runnerup = emp_namefirst>
<cfset average_rating_dept_runnerup_last_name = emp_namelast>
</cfif>
</cfoutput>
答案 0 :(得分:1)
您在问题中提到的列在查询中不存在,可能在列列表e.*
中除外。 SQL无法根据结果行数给出未定义的列错误。这根本不可能,因为在编译阶段会识别未定义的列,并且在执行阶段确定行数。
我注意到您的查询使用top
而没有order by
。您可以假设order by
中的rank()
执行您想要的操作,但事实并非如此。你需要明确它:
with Employee_cte as (
Select e.*,
(Select SUM(r.execoffice_status)
From intranet.dbo.CSEReduxResponses r
where e.emp_id = r.employee and
MONTH(r.approveddate) = MONTH(GETDATE())
) as TotalStars
From phonelist.dbo.employee e
)
Select Top 2 RANK() Over (Order by TotalStars DESC) AS EmployeeRank,*
From Employee_cte
order by TotalStars desc;
您可能会比较两个日期的月份而不包括年份,这似乎很奇怪。
答案 1 :(得分:1)
这个答案与查询无关。它会告诉你如何使用ColdFusion来处理关系,这就是你想说的。您的查询包含一个名为EmployeeRank的字段。您当前的代码包括:
<cfif EmployeeRank eq 2>
<cfset average_rating_max_runnerup = TotalStars>
<cfset average_rating_dept_runnerup = emp_namefirst>
<cfset average_rating_dept_runnerup_last_name = emp_namelast>
</cfif>
并且您的问题是如果存在平局,则可能没有EmployeeRank等于2.但是,在ColdFusion查询对象中,每列实际上是一维数组。这意味着:
<cfif EmployeeRank eq 2>
可以替换为:
<cfif EmployeeRank eq ArrayMax(getMaxstars['EmployeeRank']>
除非查询不返回任何行,否则将始终定义它。这将解决未定义变量的问题。
不包括在您的问题中是关系的另一个后果。您的当前代码将在循环查询时覆盖average_rating_dept_runnerup等变量。你必须决定该怎么做。有多种方法可行。考虑一下。你的问题涉及一个未定义的变量。