【问题标题】:Eliminate Null Output row消除空输出行
【发布时间】:2016-03-17 18:26:40
【问题描述】:

我有一个简单的选择查询,它根据日期范围给出输出:

Declare @prevDate as Date

@prevDate = (Select Max(myDates) From Top40Table Where mydates < '2012/05/03' And          PrimID=1)

Select 
    myDates, (P1/(Lag(P1) Over (Order by myDates))-1) As myRet
From 
    Top40Table
Where 
    (myDates Between @prevDate and '2012/05/10')
    And PrimID = 1

这是一个典型的结果集:

myDates     myRet
2012-05-02  NULL
2012-05-03  -0.0173786439241019
2012-05-04  -0.0268509853003636
2012-05-07  -0.00941786149400936
2012-05-08  -0.0134267235683988
2012-05-09  0.00633992501692782
2012-05-10  0.0203276794347731

选择查询是正确的,并且做了它应该做的事情,获取 prevDate 2012/05/02 以便进行计算。但我不希望在 myRet 列中有 NULL 输出的 2012/05/02 行。我可以将myDatesmyRet 数据插入到临时表(@TempTable)中,然后只选择myDatesmyRet,其中myRet 不是该表中的Null。

有没有一种更简单的方法可以做到这一点,而不必创建@TempTable,然后再创建另一个选择查询?我使用 SQL Server 2012

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    使用子查询:

    select  *
    from    (
            select  myDates
            ,       (P1/(Lag(P1) Over (Order by myDates))-1) As myRet
            from    Top40Table
            where   myDates Between @prevDate and '2012/05/10'
                    and PrimID = 1
            ) as SubQueryAlias
    where   myRet is not null
    

    【讨论】:

    • 谢谢安多玛。出于兴趣,为什么要添加为 SubQueryAlias?
    • 是的,SQL Server 总是需要子查询别名。即使不需要消除列的歧义。
    【解决方案2】:

    @Andomar ,它不是子查询,这是一个派生表,始终从 FROM 开始,子查询在 WHERE 子句之后开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多