Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将多行合并为一行,数据分为两列_Sql_Sql Server 2008 - Fatal编程技术网

Sql 将多行合并为一行,数据分为两列

Sql 将多行合并为一行,数据分为两列,sql,sql-server-2008,Sql,Sql Server 2008,我有以下方式的sql表: Table_Name Field_Name New_Value Create_Date TableTest Loading Hours 25 12/12/2015 2:56:26 p.m. TableTest Loading Hours 15 12/12/2015 2:30:23 p.m. TableTest Loading Hours 11 12

我有以下方式的sql表:

Table_Name  Field_Name       New_Value  Create_Date     
TableTest   Loading Hours       25      12/12/2015  2:56:26 p.m.    
TableTest   Loading Hours       15      12/12/2015  2:30:23 p.m.    
TableTest   Loading Hours       11      12/12/2015  2:09:42 p.m.    
TableTest   Loading_Percentage  35.8    12/12/2015  2:56:26 p.m.    
TableTest   Loading_Percentage  15.5    12/12/2015  2:30:23 p.m.    
我想做的是能够转换上述内容,我如何才能最有效地做到这一点?我可能会在上表中的加载时间中有更多的值,这需要在逻辑上显示,如下面转换的数据所示

TableTest   Field_Name         OldValue NewValue   DateTime 
TableTest   Loading Hours       15       25        12/12/2015   2:56:26 p.m.
TableTest   Loading Hours       11       15        12/12/2015   2:30:23 p.m.
TableTest   Loading Hours       NULL     11        12/12/2015   2:09:42 p.m.
TableTest   Loading_Percentage  15.5     35.8      12/12/2015   2:56:26 p.m.
TableTest   Loading_Percentage  NULL     15.5      12/12/2015   2:30:23 p.m.
提前谢谢你的帮助


干杯

您的场景正是
lag
窗口功能的设计目标。不幸的是,
lag
在SQL Server 2008中不可用。在升级之前,您可以执行以下操作:

with cte as (
  select *,
         row_number() over (partition by table_name, field_name order by create_date) as rn
    from tbl
)
select curr.table_name,
       curr.field_name,
       prev.new_value as old_value,
       curr.new_value,
       curr.create_date
  from cte curr
  left join cte prev
    on prev.table_name = curr.table_name
   and prev.field_name = curr.field_name
    on prev.rn = curr.rn + 1
 order by curr.table_name, curr.field_name, curr.rn desc
如果您升级到SQL Server 2012+,则可以通过使用
lag
,更简单地编写查询,并大大提高性能:

select table_name,
       field_name,
       lag(new_value) over (partition by table_name, field_name order by create_date) as old_value,
       new_value,
       create_date
  from tbl
 order by table_name, field_name, create_date desc

在触发器中处理此场景。为表添加Insert和Update触发器,并使用该触发器实现所需的功能。
在向表中插入/更新数据时,触发器应根据字段名称获取最后一次插入/更新的值,并插入一条具有新旧值的新记录。

指示转换的逻辑是什么?谢谢,这是正确的。如果在某个时候迁移到sql 2012,我将更新脚本+