SQL语句返回一行,但需要3行

时间:2015-06-18 15:30:20

标签: sql

我有一个sql语句返回1行,但我需要3行。 Sql语句:

Select year, sales from store where year between BETWEEN
EXTRACT(YEAR FROM sysdate)-2 and EXTRACT(YEAR FROM sysdate).

在某些情况下,我只能获得一年,我希望其他两年每次也以0为销售额返回。

有没有办法,我能做到吗?

3 个答案:

答案 0 :(得分:1)

您可以拥有一个包含所有年份的表变量,并使用“Store”表进行LEFT JOIN。这样,如果“Store”表中没有记录一年,则会得到NULL值。然后,您可以使用SQL函数ISNULL将NULL值替换为零。这样的事情。

DECLARE @years TABLE
(
     year INT
)

INSERT INTO @years (year) VALUES (2015), (2014), (2013)

SELECT s.Year, ISNULL(Sales, 0) 
FROM @years y
LEFT JOIN Store s ON s.year=y.year
WHERE ... -- your conditions

答案 1 :(得分:0)

如果你没有未来的销售而且你可以使用> =而不是BETWEEN的需要。您可以使用您想要的年份创建一个CTE,然后通过销售将OUTER JOIN创建到表中。即使没有销售,这也会给你一排。

WITH CTE AS (
    SELECT DISTINCT year from store WHERE year >= EXTRACT(YEAR FROM sysdate)-2
)
SELECT CTE.year, COALESCE(s.sales, 0) AS sales
FROM CTE
LEFT OUTER JOIN store s ON s.year = CTE.year

答案 2 :(得分:0)

您没有说出哪个平台,所以我假设它支持派生表/内联视图或其他任何调用它们。

select y.year, coalesce(s.sales, 0) as sales
from
   (select -2 union all select -1 union all select 0 as offset) as y
   left outer join
   store as s
       on  s.year = extract(year from sysdate) + y.offset
           /* adding this next condition might help the optimizer */
           and s.year >= extract(year from sysdate) - 2