SQL:如何根据特定字符模式从文件中获取数据

时间:2017-04-25 14:09:25

标签: sql sql-server tsql bulkinsert

我有一个数据文件,我将数据批量插入我的临时表。

此文件在某些​​行上具有类似的序列。

  

0123456789 0122580000 2017092 2017092 300,000.00 10,000.00

..........

  

1527856778 6189580009 2017092 2015092 200,000.00 20,000.00

我已经在表格中进行了批量插入。

我需要将该文件中的某些数据插入到临时表中,因此它具有

以下记录:

  1. 文件日期是2015091年,2017年是一年,91是一年中的一天。

    我有这个逻辑来得到一个日期:

    select dateadd(day, ltrim(rtrim(right('2017092',3))) - 1, DATEFROMPARTS(left('2017092',4) + 0, 1 ,1))
    
  2. 但是,当我改变' 2017092' to [Data] - 我进行批量插入的表中的列名:

    select dateadd(day,right(ltrim(rtrim(substring([Data],34,15))),3) - 1, DATEFROMPARTS(left(substring([Data],34,15),4) + 0, 1, 1)) from Staging_Table
    where ltrim(rtrim(substring([Data],42,5))) = '92'
    

    该查询为我0002-04-02而不是2017-04-02

    1. 总额为每行相同位置的美元金额总和:
    2. 因此,当插入完成后,我的临时表中有以下内容:

      Date           Total1        Total2
      2015-04-02    500,000,00    30,000,00
      

      基本上,我需要得到按日期分组的所有美元金额的总和。

      我该怎么办?

1 个答案:

答案 0 :(得分:2)

假设您将数据作为字符串加载到一个字段SomeCol

示例

Declare @YourTable table (SomeCol varchar(max))
Insert Into @YourTable values
('0123456789 0122580000 2017092 2017092 300,000.00 10,000.00'),
('1527856778 6189580009 2017092 2015092 200,000.00 20,000.00')

Select Date   = DateAdd(DAY,right(Pos3,3)-1,left(Pos3,4)+'0101')
      ,Total1 = sum(try_convert(money,Pos5))
      ,Total2 = sum(try_convert(money,Pos6))
 From  @YourTable A
 Cross Apply (
                Select Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(100)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(100)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(100)')))
                From  (Select Cast('<x>' + replace((Select replace(A.SomeCol,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B
 Group By Pos3

<强>返回

Date        Total1      Total2
2017-04-02  500000.00   30000.00