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

SQL语句返回一行,但需要3行,sql,Sql,我有一个返回1行的sql语句,但我需要返回3行。 Sql语句: Select year, sales from store where year between BETWEEN EXTRACT(YEAR FROM sysdate)-2 and EXTRACT(YEAR FROM sysdate). 在某些情况下,我只能得到一年,我希望其他两年也返回0作为每次销售 有没有办法,我可以做到这一点?您可以拥有一个包含所有年份的表变量,并与“Store”表进行左联接。这样,若“存储”表中一年并没有记录

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

Select year, sales from store where year between BETWEEN
EXTRACT(YEAR FROM sysdate)-2 and EXTRACT(YEAR FROM sysdate).
在某些情况下,我只能得到一年,我希望其他两年也返回0作为每次销售


有没有办法,我可以做到这一点?

您可以拥有一个包含所有年份的表变量,并与“Store”表进行左联接。这样,若“存储”表中一年并没有记录,那个么您将得到一个空值。然后,可以使用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

如果您没有未来的销售,您可以使用>=来代替,那么不需要在这两者之间进行切换。您可以创建一个包含所需年份的CTE,然后将其与sales表连接。即使没有销售,这也会给你带来麻烦

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

您没有说是哪个平台,所以我假设它支持派生表/内联视图或任何调用它们的东西

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

你的桌子怎么摆好的?您是否查询相同的3年?它是什么类型的数据库?SQLServer、Oracle、MySQL、Postgres?如果是日期字段,还应将摘录添加到年份中。例如:选择年份,提取(从年到年)介于提取(从sysdate算起的年份)-2和提取(从sysdate算起的年份)之间的商店的销售额。