SQL中的Pivot Integer按位值

时间:2012-02-29 22:26:29

标签: sql sql-server logic

使用:SQL Server 2008 R2

我的目标是取一个给定的整数(n)并选择2列中n位的整数的每个排列,如下所示。

Given: n=4

Output:

ColA  ColB
0     0
0     0
0     0
0     0
1     0
1     0
1     0
1     1
2     0
2     0
2     1
2     0
3     0
3     0
3     1
3     1
...
14    1
14    1
14    1
14    0
15    1
15    1
15    1
15    1

输出,重复不是,需要订购,这可能会或可能不会使这更容易。但是,我确实需要能够将n设置为任何整数...但是为了运行时间,我们假设它将低于10。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可能想尝试一下:

declare @bits int
set @bits = 4

;with AllTheNumbers as (
    select cast (POWER(2, @Bits) as int) - 1 Number
    union all
    select Number - 1
    from AllTheNumbers
    where Number > 0
),
Bits as (
    select @Bits - 1 Bit
    union all
    select  Bit - 1
    from Bits
    where Bit > 0
)
select *, case when (Number & cast (POWER(2, Bit) as int)) != 0 then 1 else 0 end
from AllTheNumbers cross join Bits
order by Number, Bit desc

AllTheNumbers产生0到2 ^ n-1的数字,Bits产生从0到@Bits的位数 - 1,主要部分连接它们并计算每个位置的位值。

答案 1 :(得分:0)

让我知道如果这是好的,当你说'位'我假设你的意思是2的幂 - 所以你可以在set语句中指定你想要的2的幂,它将返回所有的排列。

DECLARE @Bit INT
SET @Bit = 4

;WITH NUMS AS (
SELECT TOP(POWER(2,@Bit)+1)ROW_NUMBER() OVER(ORDER BY sc.name) - 1 [N]
FROM syscolumns sc
)

SELECT n1.N, n2.N
FROM NUMS n1
CROSS JOIN NUMS n2
WHERE (n1.N + n2.N) <= POWER(2,@Bit)
ORDER BY n1.N, n2.N