【问题标题】:2D matrix to sql table二维矩阵到 sql 表
【发布时间】:2018-07-12 03:03:04
【问题描述】:

我有一个 csv 文件,我想在 sql 表中传输。但是文件的格式是:

日期 | id1 | id2

1/1 | 1.2 | 1.3

1/2 | 1.34 | 1.25

我想将它存储在表格中的方式是:

1/1 | id1 | 1.2

1/1 | id2 | 1.3

1/2 | id1 | 1.34

1/2 | id2 | 1.25

有没有办法做到这一点?

【问题讨论】:

  • 数据源是 CSV 还是您已经导入到表中?

标签: sql sql-server excel powershell


【解决方案1】:

假设您已经将 CSV 导入到与 CSV 格式相同的临时表中:

INSERT INTO new_table
SELECT date, 'id1' AS id_name, id1 AS id
FROM temp
UNION ALL
SELECT date, 'id2' AS id_name, id2 AS id
FROM temp
ORDER BY date, id_name

http://sqlfiddle.com/#!18/e1ce2/1/1

【讨论】:

    【解决方案2】:

    如果对 TVF 开放,以下内容会将几乎任何表、视图或查询转换为 EAV 结构。

    注意我们不必定义任何字段。唯一的约定是第一列是实体

    示例

    -- Entire Table
    Select * 
     From [dbo].[tvf-EAV]((Select * from YourTable for XML RAW) )
    
    
    -- Or Row by Row via A CROSS APPLY
    Select B.*
     From  YourTable A
     Cross Apply [dbo].[tvf-EAV]((Select A.* for XML RAW) ) B
    

    都返回

    Entity  Attribute   Value
    1/1     id1         1.20
    1/1     id2         1.30
    1/2     id1         1.34
    1/2     id2         1.25
    

    有兴趣的 UDF

    CREATE FUNCTION [dbo].[tvf-EAV](@XML xml)
    Returns Table 
    As
    Return (
        with cteKey(k) as (
             Select Top 1 xA.value('local-name(.)','varchar(100)') 
              From  @XML.nodes('/row')       A(xR) 
              Cross Apply A.xR.nodes('./@*') B(xA)
        )    
        Select Entity    = xR.value('@*[1]'        ,'varchar(100)')
              ,Attribute = xA.value('local-name(.)','varchar(100)')
              ,Value     = xA.value('.'            ,'varchar(max)') 
         From  @XML.nodes('/row') A(xR)
         Cross Apply A.xR.nodes('./@*') B(xA)
         Where xA.value('local-name(.)','varchar(100)') Not In (Select k From cteKey)
    )
    -- Notes:  First Field in Query will be the Entity
    -- Select * From [dbo].[tvf-EAV]((Select MyEntity=GetUTCDate(),* From sys.dm_os_sys_info for XML RAW))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多