如何使此SQL查询起作用(带嵌套查询的计算列)?

时间:2010-11-09 16:47:26

标签: sql-server tsql nested case

如果字段asofdate等于表中的最大asofdate,我希望计算列为true,否则为false。我尝试了以下但是我收到了语法错误。这样做的正确方法是什么?

select 
case asofdate
when select max(asofdate) from sometable then 1
else 0
end 
from sometable

或者,是否可以沿着

行获得计算列
case asofdate
when END OF PREVIOUS MONTH then 1
else 0
end

5 个答案:

答案 0 :(得分:3)

来自MSDN article

  

计算列是根据a计算的   可以使用其他列的表达式   在同一张桌子里。表达可以   是一个非计算列名,   常数,功能和任何   这些组合由一个连接起来   或更多运营商。 表达式不能是子查询。

所以不,你不能这样做一个计算列。

答案 1 :(得分:2)

您不能在计算列中执行此操作,因为计算列只能根据同一记录中其他列的值计算。

您可以在视图中执行此操作:

CREATE VIEW
        v_with_last
AS
SELECT  *, CASE asofdate WHEN MAX(asofdate) OVER () THEN 1 ELSE 0 END AS the_last
FROM    sometable

很遗憾,您无法为此视图编制索引。

答案 2 :(得分:0)

在MS Sql Server中

SELECT case asofdate 
    WHEN (SELECT MAX(asofdate) FROM sometable) THEN 1 
    ELSE 0 END
FROM sometable

根据评论编辑

要结束上个月 -

SELECT DATEADD(dd,-(DAY(asofdate)),asofdate)

答案 3 :(得分:0)

所以asofdate的最大值存储在名为sometable的表中吗?在这种情况下,您不必使用每个记录的子查询来检查它。您可以将其存储在变量中,然后检查当前的asofdate。

declare @maxAsOfDate datetime;

Select @maxAsOfDate = max(asofdate) from sometable;

Select case when asofdate >= @maxAsOfDate then 1 else 0 end from sometable

干杯!

答案 4 :(得分:0)

我不知道这是否可行,但您可以创建一个公式为'MAX(asofdate)'的计算列,在该列上创建索引,然后创建一个仅将计算列与asofdate进行比较的视图。也许不是最好的解决方案,但可能比仅执行子查询要好一些。