Sql server SQL Server-包含2个表的CTE,直到消耗数量

Sql server SQL Server-包含2个表的CTE,直到消耗数量,sql-server,sql-server-2012,common-table-expression,Sql Server,Sql Server 2012,Common Table Expression,我正在尝试对我的两个表(SQL Server 2012)执行递归联接,如下所示: Table: PurchaseTmp szProductID szSupplierCode nQtyPurchase nQtySold 0001 A-101 5 5 0001 A-102 50 50 0001 A-103

我正在尝试对我的两个表(SQL Server 2012)执行递归联接,如下所示:

Table: PurchaseTmp
szProductID     szSupplierCode    nQtyPurchase     nQtySold
0001            A-101             5                5
0001            A-102             50               50
0001            A-103             2                2
0001            A-104             70               43
表:购买

szProductID    nQty     szSupplierCode
0001           5        A-101
0001           50       A-102
0001           2        A-103
0001           70       A-104

表:销售额

szProductID     nQty     szSalesID
0001            10       S-101
0001            20       S-102
0001            20       S-103
0001            50       S-104
我需要这样的结果:

szProductID      nQtySales      SupplierCode     SalesID
0001             5              A-101            S-101
0001             5              A-102            S-101
0001             20             A-102            S-102
0001             20             A-102            S-103
0001             5              A-102            S-104
0001             2              A-103            S-104
0001             43             A-104            S-104
目标是找出szSupplierCode售出的商品数量。我已经找到了很多做选择的例子,但我不确定CTE是否能解决我的问题

如果有人能用CTE或光标确认这一点,我将不胜感激

谢谢

您可以使用:

谢谢你,乔治

我已经为此工作了30多天,而你在一天之内就做到了

但我用了不同的方法,用了200多行

首先,我通过如下方式计算所有的购买和销售(总计):

Table: PurchaseTmp
szProductID     szSupplierCode    nQtyPurchase     nQtySold
0001            A-101             5                5
0001            A-102             50               50
0001            A-103             2                2
0001            A-104             70               43
在那之后,我逐行迭代……它使用Fetch Next语句生成了200多行代码

再次感谢你,乔治


这个问题得到了回答。

使用窗口聚合函数重写游标/递归的可能性很大。在您的情况下,可以通过计算购买/销售数量的累计金额,然后在重叠范围内加入:

with a as
 (
   SELECT id, szProductID, szSupplierCode, nQty, 
      --cumulative sum of quantities
      SUM(nQty) OVER (PARTITION BY szProductID ORDER BY id ROWS UNBOUNDED PRECEDING) AS cumsum
   FROM Purchase
 )
, b as 
 (
   SELECT id, szProductID, szSalesID, nQty, 
      --cumulative sum of quantities
      SUM(nQty) OVER (PARTITION BY szProductID ORDER BY id ROWS UNBOUNDED PRECEDING) AS cumsum
   FROM Sales
 )
SELECT 
   a.szSupplierCode,b.szSalesID, 
   -- calculate the assigned quantity
   CASE WHEN a.cumsum < b.cumsum THEN a.cumsum ELSE b.cumsum END
  -CASE WHEN a.cumsum -a.nQty > b.cumsum - b.nQty THEN a.cumsum - a.nQty ELSE b.cumsum - b.nQty END
FROM a
JOIN b
  ON a.szProductID = b.szProductID
 AND a.cumsum > b.cumsum - b.nQty   -- check for overlapping cumultive sums 
 AND a.cumsum - a.nQty < b.cumsum

我highjacked@GiorgosBetsos:)

我认为您的输出数据中有错误,特别是在最后三行,field
SalesID
。应该是S-103,S-104,S-104?嗨,乔治…是的..你说得对…应该是S-103,S-104,S-104..谢谢..还有一个问题:
A-102
的数量是
50
。为什么在我们继续下一次
购买之前,这个数量还没有完全消耗完呢?嗨,乔治…非常感谢你的更正…我编辑了我的结果…你错过了一个点:=)看看我做的编辑。
LEAST(a.cumsum, b.cumsum) - GREATEST(a.cumsum -a.nQty, b.cumsum - b.nQty)