ann*_*ata 7 sql t-sql sql-server
我有一组动态的数据X:
----------------------------------
x.id | x.allocated | x.unallocated
----------------------------------
foo | 2 | 0
bar | 1 | 2
----------------------------------
Run Code Online (Sandbox Code Playgroud)
我需要得到Y的结果(顺序是不重要的):
----------------------------------
y.id | y.state
----------------------------------
foo | allocated
foo | allocated
bar | allocated
bar | unallocated
bar | unallocated
----------------------------------
Run Code Online (Sandbox Code Playgroud)
我有一个基于UTF的解决方案,但我正在寻找超效率,所以我想知道是否有基于语句,非程序方式来获得这种"取消组合"的效果?
这感觉就像一个不透明,但我的大脑现在无法到达那里.
如果数据库中有数字表,则可以使用它来帮助获得结果.在我的数据库中,我有一个名为Numbers的表,其中包含Num列.
Declare @Temp Table(id VarChar(10), Allocated Int, UnAllocated Int)
Insert Into @Temp Values('foo', 2, 0)
Insert Into @Temp Values('bar',1, 2)
Select T.id,'Allocated'
From @Temp T
Inner Join Numbers
On T.Allocated >= Numbers.Num
Union All
Select T.id,'Unallocated'
From @Temp T
Inner Join Numbers
On T.unAllocated >= Numbers.Num
Run Code Online (Sandbox Code Playgroud)
使用Sql Server 2005,UNPIVOT和CTE,您可以尝试类似的东西
DECLARE @Table TABLE(
id VARCHAR(20),
allocated INT,
unallocated INT
)
INSERT INTO @Table SELECT 'foo', 2, 0
INSERT INTO @Table SELECT 'bar', 1, 2
;WITH vals AS (
SELECT *
FROM
(
SELECT id,
allocated,
unallocated
FROM @Table
) p
UNPIVOT (Cnt FOR Action IN (allocated, unallocated)) unpvt
WHERE Cnt > 0
)
, Recurs AS (
SELECT id,
Action,
Cnt - 1 Cnt
FROM vals
UNION ALL
SELECT id,
Action,
Cnt - 1 Cnt
FROM Recurs
WHERE Cnt > 0
)
SELECT id,
Action
FROM Recurs
ORDER BY id, action
Run Code Online (Sandbox Code Playgroud)