Sql server SQL Server-包含2个表的CTE,直到消耗数量
我正在尝试对我的两个表(SQL Server 2012)执行递归联接,如下所示: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
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)