如果使用RANK()进行绑定,是否可以从查询中输出数据?

时间:2014-04-16 23:06:09

标签: sql coldfusion

我有这个问题:

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

2 个答案:

答案 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等变量。你必须决定该怎么做。有多种方法可行。考虑一下。你的问题涉及一个未定义的变量。