我正在尝试编写一个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年应该是正确的答案。
希望这是有道理的。
答案 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