我有一个表格,我想写一个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已被回答并被接受,但我不太明白如何将其应用到我的场景中。对此有任何帮助非常感谢..!
答案 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。