在SQL SELECT查询中添加多行

时间:2013-09-11 16:24:59

标签: sql sql-server tsql select

我有一个表格,我想写一个query,它会根据该表中列quantity的值给出该表的重复行。

假设表格是下面给出的表格

 name | quantity
------|----------
  a   |  1
  b   |  1
  c   |  3
  d   |  2
  e   |  1

我希望能够在query中写一个T-SQL,以便它会产生如下结果;

 name | number | quantity
------|--------|----------
  a   |  1     |    1
  b   |  1     |    1
  c   |  1     |    3
  c   |  2     |    3
  c   |  3     |    3
  d   |  1     |    2
  d   |  2     |    2
  e   |  1     |    1

所以在这个结果中,“c”有3行,因为它的数量是3,并且当第n次显示该行时,数字会递增。

我发现this question已被回答并被接受,但我不太明白如何将其应用到我的场景中。对此有任何帮助非常感谢..!

4 个答案:

答案 0 :(得分:5)

试试这个:

 With Ints(n) As
 (Select 1 Union All
  Select n + 1 From Ints
  Where n < 1000)    
 Select t.Name, i.n 
 from myTable t join Ints i 
   on i.n <= t.Quantity
 option(MaxRecursion 1000)

答案 1 :(得分:2)

创建数字表并进行连接:

with numbers as (
      select 1 as n
      union all
      select 1 + n
      from numbers
      where 1 + n <= 50
    )
select t.name, numbers.n, t.quantity
from t join
     numbers
     on t.quantity <= numbers.n;

这假设最大数量为50.如果您希望它更灵活,可以放入select max(quantity) from t)

如果quantity可能很大,您可能需要添加OPTION (MAXRECURSION 0)

答案 2 :(得分:0)

我现在没有sql server。我认为DENSE_RANK是解决方案。

答案 3 :(得分:0)

首先,我会创建一个包含数字的表:

CREATE TABLE dbo.Number(Num INT IDENTITY(1,1) PRIMARY KEY);
GO
INSERT INTO dbo.Number
DEFAULT VALUES; -- this will insert 10000 rows into dbo.Number table (all numbers between 1 and 10000)
GO 10000

然后,我会创建一个约束,以确保数量列不能包含大于10000的值:

ALTER TABLE dbo.MyTable
ADD CONSTRAINT CK_MyTable_Quantity CHECK(Quantity BETWEEN 1 AND 10000); 

解决方案:

SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.name ORDER BY @@SPID) AS number
FROM dbo.MyTable t INNER JOIN dbo.Number n ON t.Quantity <= n.Num;

注意#1:此解决方案假定Quantity列是必需的(NOT NULL)并且具有整数数据类型([TINY | SMALL | BIG] INT,NUMERIC | DECIMAL(p,0))。

注意#2:此解决方案假设最小QTY为1,最大QTY为10000。