Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据列将一行拆分为两行或多行_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 根据列将一行拆分为两行或多行

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这里有一个快速破解,使用一个额外的表格填充了许

我有个问题 如果我有一排像这样的

|ordernumber|qty|articlenumber| | 123125213| 3 |fffff111 | 我怎样才能像这样把它分成三行:

|ordernumber|qty|articlenumber| | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 | | 123125213| 1 |fffff111 |
/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