二维矩阵到sql表

时间:2018-02-01 17:37:19

标签: sql sql-server excel powershell

我有一个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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

假设您已将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

答案 1 :(得分:0)

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

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

示例

-- 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))