Sql 如何创建基于另一字段中的数量将一行转换为多行的视图?
我正在使用Microsoft SQL 我有一个表格CR_INVLINES,显示如下内容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 (
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,效果非常好: