none
pivot RRS feed

  • 问题

  • 我导入数据库的数据和数据库的结构不一样,所以,先要将导入的表,进行upivot处理,然后附加到总存储表里。

    我的问题是,如何将转置后的表追加到已有表中?以下是别人以前给出的转置语句。我希望将这个转置后的表追加到“FS”这个table中。


    use Sales

    --select * from [Sales].[dbo].[科目余额表]
    declare @cmd varchar(max)
    declare @columns varchar(max)

    SELECT @columns = COALESCE(@columns + ',' + column_name,  column_name)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE  TABLE_NAME = '科目余额表'
    AND column_name NOT IN ('科目代码', '科目名称')


    set @cmd = 'select 科目代码,科目名称,类别,amount from (select 科目代码,科目名称,' + @columns + ' from [Sales].[dbo].[科目余额表]) p unpivot (amount for 类别 in (' + @columns + ')) as unpvt'
    exec(@cmd)

    • 已编辑 Ikkyuu 2013年11月26日 7:30 补充
    2013年11月26日 7:28

答案

  • use Sales

    --select * from [Sales].[dbo].[科目余额表]
    declare @cmd varchar(max)
     declare @columns varchar(max)

    SELECT @columns = COALESCE(@columns + ',' + column_name,  column_name)
     FROM INFORMATION_SCHEMA.COLUMNS
     WHERE  TABLE_NAME = '科目余额表'
    AND column_name NOT IN ('科目代码', '科目名称')


    set @cmd = '
    with
    data as(
    select 科目代码,科目名称,类别,amount from (select 科目代码,科目名称,' + @columns + ' from [Sales].[dbo].[科目余额表]) p
    unpivot (amount for 类别 in (' + @columns + ')) as unpvt
    )
     merge 总存储表 as t
     using data
      on t.科目代码 = data.科目代码 -- 判断是否存在的条件
     when matched then
      update set -- 如果根据条件判断已经存在,则做更新
       amount = data.amount -- 你要更新的列
     when not matched by target then
      insert ( 科目代码,科目名称,类别,amount )
       values ( 科目代码,科目名称,类别,amount )
    ;
    '
     exec(@cmd)

    • 已标记为答案 Ikkyuu 2013年11月27日 1:21
    2013年11月27日 1:16

全部回复

  • 那你要比较旧表的数据跟要导入的数据的差异,我觉得可以新建一个表

    unpivot 之后导入到新建的表中,然后比较新建表里的数据跟FS表是否有差异

    如果发现新建表里的数据在FS表里不存在就导入,存在就不导入

    2013年11月26日 11:21
  • use Sales

    --select * from [Sales].[dbo].[科目余额表]
    declare @cmd varchar(max)
     declare @columns varchar(max)

    SELECT @columns = COALESCE(@columns + ',' + column_name,  column_name)
     FROM INFORMATION_SCHEMA.COLUMNS
     WHERE  TABLE_NAME = '科目余额表'
    AND column_name NOT IN ('科目代码', '科目名称')


    set @cmd = '
    with
    data as(
    select 科目代码,科目名称,类别,amount from (select 科目代码,科目名称,' + @columns + ' from [Sales].[dbo].[科目余额表]) p
    unpivot (amount for 类别 in (' + @columns + ')) as unpvt
    )
     merge 总存储表 as t
     using data
      on t.科目代码 = data.科目代码 -- 判断是否存在的条件
     when matched then
      update set -- 如果根据条件判断已经存在,则做更新
       amount = data.amount -- 你要更新的列
     when not matched by target then
      insert ( 科目代码,科目名称,类别,amount )
       values ( 科目代码,科目名称,类别,amount )
    ;
    '
     exec(@cmd)

    • 已标记为答案 Ikkyuu 2013年11月27日 1:21
    2013年11月27日 1:16
  • 可能我没有说清楚,实际上只需要这样:

    set @cmd='insert into FS select [科目代码],[科目名称],...

    2013年11月27日 1:22