问题描述
这是我面临的问题的简化。它归结为显示当前和前几年产品列表的 CTE。对于第一年(2018 年),它只会展示 2018 年的产品。第二年(2019)将展示2019+2018产品等
我不知道 CTE 是否是最好的解决方案,但需要从某个地方开始。
预期结果:
年 | 产品 |
---|---|
2018 | product2018A |
2018 | product2018B |
2019 | product2018A |
2019 | product2018B |
2019 | product2019 |
2020 | product2018A |
2020 | product2018B |
2020 | product2019 |
2020 | product2020A |
2020 | product2020B |
尝试:
DECLARE @YearProduct TABLE(
[year] int,product VARCHAR(20)
);
INSERT INTO @YearProduct
([year],product)
VALUES
('2018','product2018A'),('2018','product2018B'),('2019','product2019'),('2020','product2020A'),'product2020B')
;WITH CTE AS(
SELECT [year],product
FROM @YearProduct
UNION ALL
SELECT yp.[year],yp.product
FROM @YearProduct yp
INNER JOIN CTE ON CTE.[year]+1 = (yp.[year] ) AND CTE.product = yp.product
)
SELECT * FROM CTE
解决方法
递归 cte 是正确的方法。您想要的是 CROSS JOIN
和 year
表,用于那些具有 LESS OR EQUAL TO
year
SELECT Y.[year],P.product
FROM @YearProduct P
INNER JOIN
(
SELECT distinct [year]
FROM @YearProduct
) Y ON P.[year] <= Y.[year]
ORDER BY Y.[year]