将列拆分为多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将列拆分为多行相关的知识,希望对你有一定的参考价值。

我从表中得到以下输出,并想知道将值拆分为多行的最佳方法。

**凭证|公司|

    InvoiceDescription**                   
VIV110175915    |          maec   |                   BOL013272-                              
VIV110174380    |          maec    |               BOL011927/BOL011929                         
VIV110174478     |         maec     |        BOL01256-, BOL012507-, BOL012508-         

我需要修剪“InvoiceDescription”字段并在行上复制信息,以便数据如下。

  1. 如果InvoiceDescription = BOL011448-然后返回BOL011448(删除“ - ”)
  2. 如果InvoiceDescription = BOL011927 / BOL011929然后返回两行一行BOL011927和一行BOL011929(删除“/”)
  3. 如果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

以上是关于将列拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:将列中的列表拆分为多行[重复]

Oracle 将列分隔为多行

将列的内容拆分为pyspark中的行

Pandas 用逗号将列拆分为多列

mysql - 动态地将列拆分为行

将列字符串拆分为多个列字符串