SQL Server过程:子串并将行转换为列

时间:2017-09-21 08:55:45

标签: sql sql-server sql-server-2012

我是sql的新手,我必须完成以下任务:

我有两张桌子:

表1

 |   Nr | Binary           |
 ---------------------------
 |   1  | 111111111011010  |
 |   2  | 111111111011110  |
 |   3  |        ...       |

表2

 |   Nr |
 -------- 
 |   1  |
 |   1  |
 |   1  |
 |   1  |
 |   1  |
 |   2  |
 |   2  |
 |   2  |
 |   3  |
 | ...  |

我想改变Table2(或创建一个新表),所以它看起来像这样:

 |   Nr | Binary |
 -----------------
 |   1  |    0   |
 |   1  |    1   |
 |   1  |    0   |
 |   1  |    1   |
 |   1  |    1   |
 |   2  |    0   |
 |   2  |    1   |
 |   2  |    1   |
 |  ... |   ...  |

说明:

表2有4次" 1"在专栏" Nr" - >子串化Table1列的最后4位"二进制" Row" 1"并在Table2列二进制文件中逐行插入,其中" Nr"也是1

表2有3倍" 2"在专栏" Nr" - >子串化Table1列的最后3位"二进制" Row" 2"并在Table2列二进制文件中逐行插入,其中" Nr"也是1

有什么建议吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

请参阅随附的代码。我只使用了数字12,但它的作用一般:)

declare @table1 table (nr int, [binary] varchar(30))
insert into @table1 values (1, '111111111011010'), (2, '111111111011110')

declare @table2 table (nr int)
insert into @table2 values (1),(1),(1),(1),(1),(2),(2),(2)

select A.nr,
       SUBSTRING(B.[binary], LEN(B.[binary]) - A.rownum + 1, 1) AS [bit]
from (select rownum = row_number() over(partition by nr order by nr), nr from @table2) AS A
join @table1 AS B on A.nr = B.nr