【问题标题】:Select Statement - selecting first group of results where all entries are NOT Null选择语句 - 选择所有条目均不为空的第一组结果
【发布时间】:2015-11-26 17:54:44
【问题描述】:

我正在尝试编写一个允许我选择 the latest year in which every year Value contains an entry 的选择语句

以下面的例子为例:

EarningsYearID EarningsID   Year   Value 
1                 1         2015    NULL
2                 1         2014    1.27
3                 1         2013    3.21
4                 2         2015    7.21
5                 2         2014    6.97
6                 2         2013    2.22

正确答案应该是“2014”,因为 2014 是最近一年,该年的所有条目都包含 NOT NULL 值。

我尝试了以下查询:

将@YearInWhichEarningsExistForAllComparisonCompanies 声明为 int; SET @YearInWhichEarningsExistForAllComparisonCompanies = (SELECT TOP 1 ey.[Year] 从公司 c,收益 e,收益年份 ey 在哪里 c.ticker_id = e.ticker_id AND e.EarningsID = ey.EarningsID AND c.tickerSymbol IN ('AA', 'BB') AND ey.Value 不为空 ORDER by ey.[Year] DESC);

但是,这会返回不正确的“2015”,因为存在一个为 NULL 的“2015”条目,我要求所有条目都不是 NULL。因此,下一个可用年份 2014 应该是正确的答案。

希望这是有道理的。

【问题讨论】:

    标签: tsql sql-server-2012


    【解决方案1】:

    您的查询缺少按列排序,您可以尝试以下代码:

    SET @YearInWhichEarningsExistForAllComparisonCompanies = (SELECT TOP 1 ey.[Year]
        FROM company c, earnings e, earningsYear ey
        WHERE c.ticker_id = e.ticker_id
        AND e.EarningsID = ey.EarningsID
        AND c.tickerSymbol IN ('AA', 'BB')
        AND ey.Value is not null ORDER by ey.EarningsID, ey.[Year] DESC);
    

    你也可以参考下面的可读性:

    SELECT TOP 1
        @YearInWhichEarningsExistForAllComparisonCompanies = ey.[Year]
    FROM
        company c
        JOIN earnings e ON c.ticker_id = e.ticker_id
        JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
    WHERE
        c.tickerSymbol IN ('AA', 'BB')
        AND ey.Value is not null
    ORDER by
        ey.EarningsID, 
        ey.[Year] DESC
    

    请参阅下面的更新脚本:

    ; WITH YEARVALUE ([Year], Value)
    AS
    (
        SELECT
            ey.[Year], ey.Value
        FROM
            company c
            JOIN earnings e ON c.ticker_id = e.ticker_id
            JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
        WHERE
            c.tickerSymbol IN ('AA', 'BB')
    )
    
    SELECT
        @YearInWhichEarningsExistForAllComparisonCompanies = MAX(Year)
    FROM
        YEARVALUE
    WHERE
        [Year] NOT IN (
            SELECT
                Year
            FROM
                YEARVALUE
            WHERE
                Value IS NULL)
    
    SELECT @YearInWhichEarningsExistForAllComparisonCompanies --show latest year with no null value
    

    【讨论】:

      【解决方案2】:

      如果值为正

      select max([Year]) 
      from 
      (
      SELECT [Year]
      FROM company c, earnings e, earningsYear ey
      WHERE c.ticker_id = e.ticker_id
      AND e.EarningsID = ey.EarningsID
      AND c.tickerSymbol IN ('AA', 'BB') 
      group by [Year]
      having min(isnull(ey.Value, -1000)) > -1000 
      ) tt
      

      【讨论】:

      • 对不起,实际上“价值”在某些情况下可能是负数
      • 是否有一个最小值永远不会低于您可以使用的值?
      • 很遗憾没有,我的意思是我可以使用一些荒谬的数字,但这将是一种我不热衷的黑客行为。
      • 破解?荒诞?对于数据类型,会有最小值。
      • 如果我使用较大的负值,即 > -1000,那么它会返回多年
      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多