如何将单行与sql中的列中的数字相乘

时间:2013-12-12 09:56:58

标签: sql sql-server

在我的情况下,有订单和订单位置。每个订单头寸都有一个数量。例如:

enter image description here

但是现在我需要为每个“位置元素”添加一行。这是我想要的输出:

enter image description here

我的想法是使用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运算符来模拟“乘数”:

enter image description here

3 个答案:

答案 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