我有一个sql语句返回1行,但我需要3行。 Sql语句:
Select year, sales from store where year between BETWEEN
EXTRACT(YEAR FROM sysdate)-2 and EXTRACT(YEAR FROM sysdate).
在某些情况下,我只能获得一年,我希望其他两年每次也以0为销售额返回。
有没有办法,我能做到吗?
答案 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