从单管分隔列获取数据到不同列

vai*_*hah 0 sql sql-server

我在一列 pf 表数据中有管道分隔的数据,就像这样

在此处输入图片说明

我想将该数据放在不同的列中,就像这样

在此处输入图片说明

如何将管道分隔的数据分成不同的列是 SQL?

我试着做这样的事情

;WITH GRNSumm AS (
      SELECT Value
           ,ID = Row_Number() OVER (ORDER BY Value)
      FROM   [Split]('asfasdjfsdg|sdhgs|sdg|sdgl','|')
    )
    SELECT 
    col1 = MAX(CASE WHEN ID = 1 THEN Value ELSE NULL END)
         , col2 = MAX(CASE WHEN ID = 2 THEN Value ELSE NULL END)
         , col3 = MAX(CASE WHEN ID = 3 THEN Value ELSE NULL END)
         , col4 = MAX(CASE WHEN ID = 4 THEN Value ELSE NULL END)
    into #tempdata
    FROM   GRNSumm 
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用

cas*_*ive 5

如果您使用的是 SQL Server 2017 及更高版本,则可以像这样使用表值函数string_split

select * from table1 outer apply string_split(col3, '|')
Run Code Online (Sandbox Code Playgroud)

现在的问题是,你需要转动,为了得到你的第二个表的模式的行列。

现在,在您的情况下,它可能如下所示:

;WITH 
input_data as (
    select 1 col1, 1 col2, 'abc|bcd|asd|qwe' col3 union all
    select 1 col1, 2 col2, 'abc|dhejg|dlsjd|qwe' col3 union all
    select 2 col1, 3 col2, 'hdf|sjd|sdjf|sjdgs' col3 union all
    select 2 col1, 4 col2, 'asfasdjfsdg|sdhgs|sdg|sdgl' col3
),
GRNSumm AS (
    SELECT col1, col2, col3, Value, Row_Number() OVER (partition by col1, col2 ORDER BY Value) id
    FROM   input_data outer apply [Split](col3, '|') --put string_split here or your own tvf
)
SELECT col1, col2, col3, [1] as PackingSlip, [2] as ReceivingLog, [3] as DateReceived, [4] as GLExpenseAccount
  from GRNSumm
 PIVOT  
(MAX(Value) FOR id IN ([1], [2], [3], [4])) AS PivotTable;  
Run Code Online (Sandbox Code Playgroud)

我说可以,因为现在它变得棘手。根据内容的位置,外部应用将不保证行的任何顺序。此外,row_number over (order by value)将确保顺序取决于内容而不是字符串的位置。