我在一列 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)
但它对我不起作用
如果您使用的是 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)将确保顺序取决于内容而不是字符串的位置。