选择语句 - 选择所有条目都不为空的第一组结果

时间:2015-11-26 17:54:45

标签: tsql sql-server-2012

我正在尝试编写一个select语句,允许我选择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值。

我尝试了以下查询:

DECLARE @YearInWhichEarningsExistForAllComparisonCompanies as int;

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.[Year] DESC);

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

希望这是有道理的。

2 个答案:

答案 0 :(得分:0)

如果值为正

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

答案 1 :(得分:0)

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

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