它有些什么复杂。你需要一个递归CTE来实现它。
以上部分的架构:
CREATE TABLE #T_TRA_TRANSACTION (F_Id INT IDENTITY PRIMARY KEY
,F_IN_OUT_DTE DATETIME
,F_QTY INT
,F_LOT_NUMBER VARCHAR(50)
,F_BILLOF_ENTRYNUMBER VARCHAR(50)
,F_STOCK_TYPE VARCHAR(10))
INSERT INTO #T_TRA_TRANSACTION
SELECT '2016-05-31',15,'160427A161','14-2-4-15451983','IN'
UNION ALL
SELECT '2016-05-31',5,'160427A161','14-2-4-15451983','IN'
UNION ALL
SELECT '2016-08-02',10,'160427A161','14-2-4-15546475','IN'
UNION ALL
SELECT '2016-08-02',10,'160427A161','14-2-4-15546475','IN'
UNION ALL
SELECT '2016-08-02',5,'160427A161','14-2-4-15546475','IN'
UNION ALL
SELECT '2016-08-14',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-14',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-14',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-14',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-18',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-18',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-18',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-18',5,'160427A161','14-2-4-15546475','OUT'
UNION ALL
SELECT '2016-08-18',5,'160427A161','14-2-4-15546475','OUT'
并尝试下面的查询。我加入了每个CTE的中间结果对了解我们正在获取从中
;WITH CTE_BILL_WISE AS(
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT 1)) SNO_IN
,SUM(F_QTY) IN_QTY
, F_BILLOF_ENTRYNUMBER
FROM
#T_TRA_TRANSACTION
WHERE
F_LOT_NUMBER = '160427A161'
AND F_STOCK_TYPE = 'IN'
GROUP BY F_BILLOF_ENTRYNUMBER
/* RESULT OF CTE_BILL_WISE
+--------+--------+----------------------+
| SNO_IN | IN_QTY | F_BILLOF_ENTRYNUMBER |
+--------+--------+----------------------+
| 1 | 20 | 14-2-4-15451983 |
| 2 | 25 | 14-2-4-15546475 |
+--------+--------+----------------------+
*/
)
,CTE_BILL_QTY_RANGE AS
(
SELECT SNO_IN, F_BILLOF_ENTRYNUMBER, 0 START_QTY ,IN_QTY AS END_QTY FROM CTE_BILL_WISE WHERE SNO_IN = 1
UNION ALL
SELECT C4.SNO_IN+1,C.F_BILLOF_ENTRYNUMBER, C4.END_QTY+1,C4.END_QTY+ C.IN_QTY FROM CTE_BILL_QTY_RANGE C4
INNER JOIN CTE_BILL_WISE C ON C4.SNO_IN+1 = C.SNO_IN
/* RESULT OF CTE_BILL_QTY_RANGE
+--------+----------------------+-----------+---------+
| SNO_IN | F_BILLOF_ENTRYNUMBER | START_QTY | END_QTY |
+--------+----------------------+-----------+---------+
| 1 | 14-2-4-15451983 | 0 | 20 |
| 2 | 14-2-4-15546475 | 21 | 45 |
+--------+----------------------+-----------+---------+
*/
)
,CTE_OUT_TYPE AS
(
SELECT F_Id ,
F_QTY
,ROW_NUMBER() OVER(ORDER BY F_Id) SNO_OUT
FROM #T_TRA_TRANSACTION
WHERE F_LOT_NUMBER = '160427A161'
AND F_STOCK_TYPE = 'OUT'
/* RESULT OF CTE_OUT_TYPE
+------+-------+---------+
| F_Id | F_QTY | SNO_OUT |
+------+-------+---------+
| 6 | 5 | 1 |
| 7 | 5 | 2 |
| 8 | 5 | 3 |
| 9 | 5 | 4 |
| 10 | 5 | 5 |
| 11 | 5 | 6 |
| 12 | 5 | 7 |
| 13 | 5 | 8 |
| 14 | 5 | 9 |
+------+-------+---------+
*/
)
,CTE_OUT_QTY_SUM AS
(
SELECT SNO_OUT, F_Id,F_QTY FROM CTE_OUT_TYPE WHERE SNO_OUT = 1
UNION ALL
SELECT C2.SNO_OUT, C2.F_Id,F_QTY = C3.F_QTY+C2.F_QTY FROM CTE_OUT_QTY_SUM C3
INNER JOIN CTE_OUT_TYPE C2 ON C3.SNO_OUT+1 = C2.SNO_OUT
/* RESULT OF CTE_OUT_QTY_SUM
+---------+------+-------+
| SNO_OUT | F_Id | F_QTY |
+---------+------+-------+
| 1 | 6 | 5 |
| 2 | 7 | 10 |
| 3 | 8 | 15 |
| 4 | 9 | 20 |
| 5 | 10 | 25 |
| 6 | 11 | 30 |
| 7 | 12 | 35 |
| 8 | 13 | 40 |
| 9 | 14 | 45 |
+---------+------+-------+
*/
)
SELECT C3.F_Id, C4.F_BILLOF_ENTRYNUMBER FROM CTE_OUT_QTY_SUM C3
INNER JOIN CTE_BILL_QTY_RANGE C4 ON C3.F_QTY BETWEEN C4.START_QTY AND C4.END_QTY
/* RESULT OF FINAL CTE
+------+----------------------+
| F_Id | F_BILLOF_ENTRYNUMBER |
+------+----------------------+
| 6 | 14-2-4-15451983 |
| 7 | 14-2-4-15451983 |
| 8 | 14-2-4-15451983 |
| 9 | 14-2-4-15451983 |
| 10 | 14-2-4-15546475 |
| 11 | 14-2-4-15546475 |
| 12 | 14-2-4-15546475 |
| 13 | 14-2-4-15546475 |
| 14 | 14-2-4-15546475 |
+------+----------------------+
*/
您可以更改最后选择要更新一样
UPDATE #T_TRA_TRANSACTION SET #T_TRA_TRANSACTION.F_BILLOF_ENTRYNUMBER = C4.F_BILLOF_ENTRYNUMBER
FROM CTE_OUT_QTY_SUM C3
INNER JOIN CTE_BILL_QTY_RANGE C4 ON C3.F_QTY BETWEEN C4.START_QTY AND C4.END_QTY
INNER JOIN #T_TRA_TRANSACTION ON #T_TRA_TRANSACTION.F_Id = C3.F_Id
从表'T_Tra_Transaction'和'tout'提供一些示例数据。同时提供您正在寻找的预期结果。 – Viki888
预期的结果将有助于描述以了解需求。 –
@ Viki888 in out status first 100 qty我要更新第一个BOE号码和另一个70数量我想更新第二个BOE号码 – user3262364