我有一個 CTE,它回傳一組專案 ID 和數量。我正在嘗試使用另一個 CTE 根據定義的容器大小將每一行拆分為多行。例如,如果容器大小指定為 20,行數為 49,我想將其拆分為 2 行 20 行和 9 行。
下面是我最終陷入困境的地方。對于這種情況,遞回 CTE 是錯誤的選擇嗎?任何幫助,將不勝感激。
DECLARE @ContainerSize int = 20;
WITH ItemDetails (ItemID, Qty) AS (
-- Query that returns data like below
SELECT 29, 49
UNION ALL
SELECT 33, 64
UNION ALL
SELECT 38, 32
UNION ALL
SELECT 41, 54
),
ItemDetailsSplit(n, ItemID, Qty) AS (
SELECT
0,
ItemID,
Qty
FROM ItemDetails
UNION ALL
SELECT
n 1,
ItemID,
CASE WHEN Qty < (@ContainerSize * (n 1))
THEN Qty
ELSE Qty - (@ContainerSize * (n 1))
END AS [Qty]
FROM ItemDetailsSplit
WHERE ( Qty > (@ContainerSize * n) )
)
SELECT *
FROM ItemDetailsSplit
ORDER BY ItemID, Qty DESC;
uj5u.com熱心網友回復:
在不知道您的特定 RDBMS 的情況下,我有一個適用于 SQL Server 的解決方案,它可以輕松轉換為任何資料庫平臺。
這使用了一個數字表——這里是另一個 CTE,但在生產中你會有一個永久的表。
declare @ContainerSize int = 20;
with numbers (n) as (
select top(100) Row_Number() over(order by(select null)) from master.dbo.spt_values
), ItemDetails (ItemID, Qty) as (
-- Query that returns data like below
select 29, 49
union all
select 33, 64
union all
select 38, 32
union all
select 41, 54
)
select ItemID, Iif(n <= Qty / @ContainerSize, @ContainerSize, Qty % @ContainerSize) Qty
from ItemDetails d
cross apply numbers n
where n <= (Qty / @ContainerSize) Iif(Qty % @ContainerSize = 0, 0, 1)
order by ItemID, Qty
見作業資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366511.html
標籤:sql sql-server 公用表表达式 递归查询
上一篇:每個專案的值加一
