我正在嘗試為欄位中的每個數量輸出每個零件的記錄。例如,如果一個零件的數量為 10,那么我希望該零件被列出 10 次,如果數量為 2,那么我只希望該零件被列出兩次。
以下是資料示例:
Part Qty
PSR6621581 17
PSR6620952 13
PSR6620754 11
PSR6621436 11
PSR6621029 9
PSR661712 9
PSR661907 9
PSR662998 8
PSR6620574 7
PSR661781 7
有什么建議?
uj5u.com熱心網友回復:
您可以使用遞回 CTE 來擴展行。例如:
with
p as (
select part, qty, 1 as n from t
union all
select part, qty, n 1
from p
where n < qty
)
select part, qty from p
結果:
part qty
----- ---
ABC 1
DEF 4
DEF 4
DEF 4
DEF 4
請參閱db<>fiddle 上的運行示例。
uj5u.com熱心網友回復:
這是另一種選擇。這是使用理貨,這是處理此類事情的理想方式。我將這個視圖保留在我的系統上,作為擁有一個計數表的一種瘋狂的快速方式。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E 2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E 4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
現在我們只用您的示例資料創建一個虛擬表。
declare @Something table
(
Part varchar(10)
, Qty int
)
insert @Something
select 'PSR6621581', 17 union all
select 'PSR6620952', 13 union all
select 'PSR6620754', 11 union all
select 'PSR6621436', 11 union all
select 'PSR6621029', 9 union all
select 'PSR661712', 9 union all
select 'PSR661907', 9 union all
select 'PSR662998', 8 union all
select 'PSR6620574', 7 union all
select 'PSR661781', 7
現在設定已經完成,生成您想要的輸出的查詢是超級容易和閃電般執行的。
select s.Part
, s.Qty
from @Something s
join cteTally t on t.N <= s.Qty
order by s.Part
, t.N
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361402.html
標籤:sql sql-server
