Sql 根据列将一行拆分为两行或多行
我有个问题 如果我有一排像这样的 |ordernumber|qty|articlenumber| | 123125213| 3 |fffff111 | 我怎样才能像这样把它分成三行: |ordernumber|qty|articlenumber| | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 |Sql 根据列将一行拆分为两行或多行,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有个问题 如果我有一排像这样的 |ordernumber|qty|articlenumber| | 123125213| 3 |fffff111 | 我怎样才能像这样把它分成三行: |ordernumber|qty|articlenumber| | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 | /J这里有一个快速破解,使用一个额外的表格填充了许
/J这里有一个快速破解,使用一个额外的表格填充了许多适合您期望的数量值的行:
-- helper table
CREATE TABLE qty_splitter (qty int)
INSERT INTO qty_splitter VALUES (1)
INSERT INTO qty_splitter VALUES (2)
INSERT INTO qty_splitter VALUES (3)
INSERT INTO qty_splitter VALUES (4)
INSERT INTO qty_splitter VALUES (5)
....
-- query to produce split rows
SELECT t1.ordernumber, 1, t1.articlenumber
FROM table1 t1
INNER JOIN qty_splitter qs on t.qty >= qs.qty
您可以使用递归CTE:
WITH RCTE AS
(
SELECT
ordernumber, qty, articlenumber, qty AS L
FROM Table1
UNION ALL
SELECT
ordernumber, 1, articlenumber, L - 1 AS L
FROM RCTE
WHERE L>0
)
SELECT ordernumber,qty, articlenumber
FROM RCTE WHERE qty = 1
编辑:
根据Marek Grzenkowicz的回答和MatBailie的评论,全新理念:
WITH CTE_Nums AS
(
SELECT MAX(qty) n FROM dbo.Table1
UNION ALL
SELECT n-1 FROM CTE_Nums
WHERE n>1
)
SELECT ordernumber ,
1 AS qty,
articlenumber
FROM dbo.Table1 t1
INNER JOIN CTE_Nums n ON t1.qty >= n.n
正在生成从1到maxqty的编号,并在其上联接表
你可以使用
也可以将选项与master..spt_值系统表一起使用
SELECT t.ordernumber, o.qty, t.articlenumber
FROM dbo.SplitTable t CROSS APPLY (
SELECT 1 AS qty
FROM master..spt_values v
WHERE v.TYPE = 'P' AND v.number < t.qty
) o
然而,出于此目的,最好使用自己的序列表
请参见演示+1好主意。也许可以根据需要动态填充拆分器表。嗯,每个数量值只需一行,然后使用qs.qty@MatBailie加入它。非常好的建议!
SELECT t.ordernumber, o.qty, t.articlenumber
FROM dbo.SplitTable t CROSS APPLY (
SELECT 1 AS qty
FROM master..spt_values v
WHERE v.TYPE = 'P' AND v.number < t.qty
) o