1

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

假设下表是下面给出的

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

我希望能够写一个queryinT-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 次出现,数字会增加。

我发现这个问题已经得到回答和接受,但我不太明白如何将它应用到我的场景中。对此的任何帮助都非常感谢..!

4

4 回答 4

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)
于 2013-09-11T16:30:14.847 回答
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;

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

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

于 2013-09-11T16:28:29.227 回答
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 列是必需的(非 NULL)并且具有整数数据类型([TINY|SMALL|BIG]INT, NUMERIC|DECIMAL(p,0))。

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

于 2013-09-11T16:48:45.940 回答
0

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

于 2013-09-11T16:32:28.697 回答