在我的情况下,有订单和订单位置。每个订单头寸都有一个数量。例如:
但是现在我需要为每个“位置元素”添加一行。这是我想要的输出:
我的想法是使用rank()
/ over()
来获取增量数字,但我不知道如何将数量用作乘数。
是否有智能解决方案将单个列用作“行乘数”?在我的例子中,sql函数或循环是不可能的,只是简单的sql:)
谢谢! :)
使用gvee
的查询,我能够为我的问题创建解决方案:
Select
BelPosId as OrderPositionId,
Artikelnummer as ProductId,
Bezeichnung1 as ProductName,
Menge as Quantity,
NumberTable.number+1 as ElementId
FROM KHKVKBelegePositionen
INNER JOIN
(SELECT (a.number * 256) + b.number As number
FROM (
SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number <= 255
) As a
CROSS
JOIN (
SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number <= 255
) As b) NumberTable
ON
NumberTable.number < Menge
诀窍是将inner join
列“数量”改为数字表中“数字”列,并使用less than
运算符来模拟“乘数”:
答案 0 :(得分:6)
您需要加入数字表格!
CREATE TABLE dbo.numbers (
number int NOT NULL
)
ALTER TABLE dbo.numbers
ADD
CONSTRAINT pk_numbers PRIMARY KEY CLUSTERED (number)
WITH FILLFACTOR = 100
GO
INSERT INTO dbo.numbers (number)
SELECT (a.number * 256) + b.number As number
FROM (
SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number <= 255
) As a
CROSS
JOIN (
SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number <= 255
) As b
这是我保留最新脚本的地方:http://gvee.co.uk/files/sql/dbo.numbers%20&%20dbo.calendar.sql
完成此操作后,您可以执行简单的连接:
SELECT KHKVKBelegePositionen.BelPosId As OrderPositionId
, KHKVKBelegePositionen.Artikelnummer As ProductId
, KHKVKBelegePositionen.Bezeichung1 As ProductName
, KHKVKBelegePositionen.Menge As Quantity
, numbers.number As ElemendId
FROM KHKVKBelegePositionen
INNER
JOIN dbo.numbers
ON numbers.number BETWEEN 1 AND KHKVKBelegePositionen.Menge
答案 1 :(得分:3)
您可以使用不需要任何外部表的脚本:
SELECT t.quantity,
n.num
FROM table10 t
INNER JOIN (SELECT Row_number()
OVER(
ORDER BY object_id) num
FROM sys.all_objects) n
ON t.quantity >= n.num
我没有包含其他列,但您可以将它们添加到select
列表
答案 2 :(得分:0)
您可以使用数字创建表格:
/* table variable is used just for example.
It's better to create table and fill it with numbers once*/
declare @numbers table(i int)
declare @i int=1
while @i<100
begin
insert into @numbers values (@i)
set @i=@i+1
end
declare @your_table table (N int)
insert into @your_table values (10),(1),(5)
select yt.N, n.i
from @your_table yt
join @numbers n ON n.i<=yt.N
order by yt.N, n.i