【问题标题】:Split the column in to three columns for each input column based on comma根据逗号将每个输入列拆分为三列
【发布时间】:2020-04-29 23:10:00
【问题描述】:

输入:

  ID      TYPE      prouctValues            subproValues                Amount
23844   12, 19     0.0000, 0.0000           0.0000, 0.0000          0.0000, 0.0000,37464.083
25397   1, 3,26    0.0000, 0.0000,2.345     0.0000,0.2345, 0.0000   25455.6800, 0.0000

我需要将其转换为三列 输出:

id      t1  t2  t3   pval_1 pval_2 pval_3 Spval_1 spval_2 spval_3  amt_1   amt_2   amt3
23844   12  19  null 0.0000 0.0000  null  0.0000  0.0000  null    0.0000  0.0000  364.083
25397   12  03  26   0.0000 0.0000  2.345 0.0000  0.2345  0.0000  254.680 0.0000  null

【问题讨论】:

  • 如果将多个值硬塞到一列中,请创建单独的列。
  • 输入来自不同的来源,我需要转换成输出格式。
  • 可能的值有最大数量吗?就像你在这里显示的是 3 ?
  • 是的,每列总共 3 个和 3 个
  • 这和here是同一个问题。最好改进现有的问题...

标签: sql tsql sql-server-2016


【解决方案1】:

如果您有已知的或最大数量的列并且打开了 HELPER 函数。

示例

Select A.ID 
      ,t1     = B.Pos1
      ,t2     = B.Pos2
      ,t3     = B.Pos3
      ,pval1  = C.Pos1
      ,pval2  = C.Pos2
      ,pval3  = C.Pos3
      ,spval1 = D.Pos1
      ,spval2 = D.Pos2
      ,spval3 = D.Pos3
      ,amt_1  = E.Pos1
      ,amt_2  = E.Pos2
      ,amt_3  = E.Pos3
 From YourTable A
 Cross Apply [dbo].[tvf-Str-Parse-Col]([TYPE],',') B
 Cross Apply [dbo].[tvf-Str-Parse-Col]([prouctValues],',') C
 Cross Apply [dbo].[tvf-Str-Parse-Col]([subproValues],',') D
 Cross Apply [dbo].[tvf-Str-Parse-Col]([Amount],',') E

退货

有兴趣的 TVF

CREATE FUNCTION [dbo].[tvf-Str-Parse-Col] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (
    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
          ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
          ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
          ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
    From  ( values (cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml)))  A(xDim)
)

【讨论】:

  • 完美运行。谢谢约翰。
  • 总是乐于提供帮助
猜你喜欢
  • 2018-11-11
  • 2018-07-27
  • 2019-09-17
  • 1970-01-01
  • 2012-01-24
  • 2016-10-02
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多