将列拆分为多行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将列拆分为多行相关的知识,希望对你有一定的参考价值。
我从表中得到以下输出,并想知道将值拆分为多行的最佳方法。
**凭证|公司|
InvoiceDescription**
VIV110175915 | maec | BOL013272-
VIV110174380 | maec | BOL011927/BOL011929
VIV110174478 | maec | BOL01256-, BOL012507-, BOL012508-
我需要修剪“InvoiceDescription”字段并在行上复制信息,以便数据如下。
- 如果InvoiceDescription = BOL011448-然后返回BOL011448(删除“ - ”)
- 如果InvoiceDescription = BOL011927 / BOL011929然后返回两行一行BOL011927和一行BOL011929(删除“/”)
- 如果InvoiceDescription = BOL01256-,BOL012507-,BOL012508-则返回三行一行BOL01256和一行BOL012507和一行BOL012508(删除“ - ”)
我想要的输出:
voucher | company | InvoiceDescription
VIV110175915 | maec | BOL013272
VIV110174380 | maec | BOL011927
VIV110174380 | maec | BOL011929
VIV110174478 | maec | BOL01256
VIV110174478 | maec | BOL012507
VIV110174478 | maec | BOL012508
我正在使用MS SQL Server 2012来设置这些表,只需要一些关于如何拆分主题字段的帮助。
谢谢,
答案
这是一种不需要TVF的方法
Select A.[Voucher]
,A.[company]
,B.*
From YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = replace(LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))),'-','')
From (Select x = Cast('<x>' + replace(replace([InvoiceDescription],'/',','),',','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
您可能会注意到我保留了序列,我发现它不时有用。
返回
Voucher company RetSeq RetVal
VIV110175915 maec 1 BOL013272
VIV110174380 maec 1 BOL011927
VIV110174380 maec 2 BOL011929
VIV110174478 maec 1 BOL01256
VIV110174478 maec 2 BOL012507
VIV110174478 maec 3 BOL012508
以上是关于将列拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章