2

DB-小提琴

这是我面临的问题的简化。它归结为显示当前和前几年产品列表的 CTE。第一年(2018 年),它只会显示 2018 年的产品。第二年(2019)将展示2019+2018产品等。

我不知道 CTE 是否是最佳解决方案,但需要从某个地方开始。

预期结果:

产品
2018 产品2018A
2018 产品2018B
2019 产品2018A
2019 产品2018B
2019 产品2019
2020 产品2018A
2020 产品2018B
2020 产品2019
2020 产品2020A
2020 产品2020B

试图:

DECLARE   @YearProduct  TABLE(
    [year] int,
    product VARCHAR(20)
);

INSERT INTO @YearProduct
([year], product)
VALUES 
('2018', 'product2018A'),
('2018', 'product2018B'),
('2019', 'product2019'),
('2020', 'product2020A'),
('2020', '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
4

1 回答 1

1

递归 cte 是正确的方法。你想要的是那些产品CROSS JOINyear桌子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]

小提琴手

于 2021-03-30T08:31:20.897 回答