Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 - Fatal编程技术网

Sql 如何创建基于另一字段中的数量将一行转换为多行的视图?

Sql 如何创建基于另一字段中的数量将一行转换为多行的视图?,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用Microsoft SQL 我有一个表格CR_INVLINES,显示如下内容 STOCKCODE QTY BARCODE GUITAR101 3 456812313 DESK 1 568123122 LAMP 2 845646962 我需要视图返回数量倍数的行,如下所示: 嗯,对于这个,你需要一个数字表。以下是一个在许多情况下都能使用的快速简便的解决方案: with numbers as (

我正在使用Microsoft SQL

我有一个表格CR_INVLINES,显示如下内容

STOCKCODE     QTY   BARCODE  
GUITAR101     3     456812313
DESK          1     568123122
LAMP          2     845646962
我需要视图返回数量倍数的行,如下所示:


嗯,对于这个,你需要一个数字表。以下是一个在许多情况下都能使用的快速简便的解决方案:

with numbers as (
       select row_number() over (order by (select null)) as num
      )
select il.stockcode, barcode
from CR_INVLINES il join
     numbers n
     on il.qty <= n.num
更正式的回答是这样的:

with digits as (
     select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all
     select 5 union all select 6 union all select 7 union all select 8 union all select 9
   ),
   numbers as (
    select d1.d*100+d2.d*10+d3.d
    from digits d1 cross join digits d2 cross join digits d3
   )
select il.stockcode, barcode
from CR_INVLINES il join
     numbers n
     on il.qty < n.num

注意您可以使用递归CTE来获得结果:

;WITH CTE AS
(
    SELECT *
    FROM CR_INVLINES
    UNION ALL 
    SELECT stockcode, qty-1, BARCODE
    FROM CTE
    WHERE qty-1 >= 1
)
SELECT STOCKCODE, Barcode
FROM CTE
order by stockcode
OPTION(MAXRECURSION 0);
| STOCKCODE |   BARCODE |
-------------------------
|      DESK | 568123122 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
|      LAMP | 845646962 |
|      LAMP | 845646962 |

结果如下:

;WITH CTE AS
(
    SELECT *
    FROM CR_INVLINES
    UNION ALL 
    SELECT stockcode, qty-1, BARCODE
    FROM CTE
    WHERE qty-1 >= 1
)
SELECT STOCKCODE, Barcode
FROM CTE
order by stockcode
OPTION(MAXRECURSION 0);
| STOCKCODE |   BARCODE |
-------------------------
|      DESK | 568123122 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
|      LAMP | 845646962 |
|      LAMP | 845646962 |

太棒了,非常感谢我将此应用于DB,效果非常好: