分组效应?

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的解决方案,但我正在寻找超效率,所以我想知道是否有基于语句,非程序方式来获得这种"取消组合"的效果?

这感觉就像一个不透明,但我的大脑现在无法到达那里.

G M*_*ros 7

如果数据库中有数字表,则可以使用它来帮助获得结果.在我的数据库中,我有一个名为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)


Adr*_*der 6

使用Sql Server 2005,UNPIVOTCTE,您可以尝试类似的东西

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)