带有列号的SQL循环

Ste*_*sen 2 sql sql-server sql-server-2014

我有一张3柱和4排的桌子.

        Col1    Col2    Col3
Row1    A1      B1      1
Row2    A2      B2      0
Row3    A3      B3      3
Row4    A4      B4      1
Run Code Online (Sandbox Code Playgroud)

一个select * from [table]回报:

A1 B1 1
A2 B2 0
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)

我想要一个选择:

A1 B1 1
A3 B3 3 
A3 B3 3
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)

Col3给出行返回的数量.

Joe*_*orn 5

从数字表开始......每个数字都有一行的表格,最高可达到您的最大值Col3.它看起来像这样:

表:数字

Value
-----
  1
  2
  3
  4
  5
  ...

然后你可以JOIN使用不等式来到这个表:

SELECT Col1, Col2, Col3
FROM [table] t
INNER JOIN NUMBERS n ON n.Value <= t.Col3
Run Code Online (Sandbox Code Playgroud)

这将使您的Row3值与Numbers表匹配3次,在结果中复制该行,而Row2值将不匹配Numbers表中的任何记录,将其从结果中删除.

Numbers您可以在此处查看生成表格的几个选项:

创建和填充数字表的最佳方法是什么?

使用该问题的选项6:

WITH Numbers AS (
     SELECT TOP 10000 row_number() over(order by t1.number) as [Value]
     FROM master..spt_values t1 
     CROSS JOIN master..spt_values t2
)
SELECT Col1, Col2, Col3
FROM [table] t
INNER JOIN NUMBERS n ON n.Value <= t.Col3
Run Code Online (Sandbox Code Playgroud)

请注意,这对于您的示例数据来说太过分了3.对于任何小于50的东西,你可以只对表格进行硬编码.我假设你的真实数据要高得多.