Sql server microsoftsqlserver中的递归查询
我正在MS SQL server(2008 R2)中进行递归查询(使用CTE)。 我的结构如下: 餐桌销售Sql server microsoftsqlserver中的递归查询,sql-server,sql-server-2008,recursion,common-table-expression,Sql Server,Sql Server 2008,Recursion,Common Table Expression,我正在MS SQL server(2008 R2)中进行递归查询(使用CTE)。 我的结构如下: 餐桌销售 PROD_ID SALE_MONTH QUANTITY -------------------------------------- 1 2010-01-01 5 1 2010-02-01 6 1 2010-03-01 7 2
PROD_ID SALE_MONTH QUANTITY
--------------------------------------
1 2010-01-01 5
1 2010-02-01 6
1 2010-03-01 7
2 2010-01-01 1
2 2010-02-01 2
2 2010-03-01 3
3 2010-01-01 10
3 2010-02-01 20
3 2010-03-01 30
然后,我们被要求修改并添加一个表,如:
表PROD_替换
ID OLD_PROD_ID NEW_PROD_ID
----------------------------------
1 1 2
2 2 3
第一个表是每个日期的产品销售额(实际上,这是最重要的月份)。第二个有替换项:即产品1已替换为产品2,依此类推
因此,我被要求做一份报告,说明几个月来产品的销售情况,并考虑更换产品。也就是说,如果您计算产品2的销售额,您将得到如下结果:
产品2销售:
PROD_ID SALE_MONTH QUANTITY
--------------------------------------
2 2010-01-01 (1+5)
2 2010-02-01 (2+6)
2 2010-03-01 (3+7)
产品3销售:
PROD_ID SALE_MONTH QUANTITY
--------------------------------------
3 2010-01-01 (1+5+10)
3 2010-02-01 (2+6+20)
3 2010-03-01 (3+7+30)
那么,如何使用递归查询获取此信息?
我的第一句话:
;WITH CTE(SALE_MONTH, PROD_ID, QUANTITY) AS
(
SELECT s.SALE_MONTH, s.PROD_ID, CAST( ISNULL(QUANTITY, 0) as NUMERIC) as QUANTITY
FROM Sales s
WHERE s.PROD_ID = 2
UNION ALL
SELECT CTE.SALE_MONTH, CTE.PROD_ID, CAST((ISNULL(CTE.QUANTITY,0) + ISNULL(s.QUANTITY, 0)) as NUMERIC) as QUANTITY_TOTAL
FROM Sales s
JOIN CTE ON CTE.PROD_ID = s.PROD_ID
JOIN PROD_REPLACEMENTS pr ON pr.OLD_PROD_ID = CTE.PROD_ID
WHERE s.PROD_ID pr.NEW_PROD_ID
)
SELECT SALE_MONTH, PROD_ID, QUANTITY
FROM CTE
提前感谢
更新:
SQL FIDDLE:除非您能告诉我们有关表结构的信息,否则我们只能在这里猜测。至少sqlfiddle是一个好的开始。sqlfiddle.comOK@SeanLange,我在这里添加了它:。谢谢看起来你自己已经回答了这个问题??我建议您指定数字的比例和精度,而不要依赖默认值。@SeanLange为什么这么说?我不回答我自己!我发布的查询(CTE)没有像我预期的那样工作。你明白我的问题了吗?如果没有,我会重新制作!谢谢你的评论!谢谢你的提琴。它有助于了解正在发生的事情,并为人们提供了一种立即着手解决方案的方法。我不太确定你想要从小提琴中提供的样品中得到什么样的输出。