Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server microsoftsqlserver中的递归查询_Sql Server_Sql Server 2008_Recursion_Common Table Expression - Fatal编程技术网

Sql server microsoftsqlserver中的递归查询

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

我正在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        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)没有像我预期的那样工作。你明白我的问题了吗?如果没有,我会重新制作!谢谢你的评论!谢谢你的提琴。它有助于了解正在发生的事情,并为人们提供了一种立即着手解决方案的方法。我不太确定你想要从小提琴中提供的样品中得到什么样的输出。