TSQL:如何将值从上一行的一列复制到另一列的下一行

TSQL:如何将值从上一行的一列复制到另一列的下一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL表,我想在其中从Number的值更新Location/Description的值 例如:表中的第二行应该有一个Loaction/description作为“冷冻柜Twnety”。像wise一样,最后两行的位置/描述应为“冷冻室三十” 数字列是一个ID,不知何故,该列被位置/描述值填充。我想将它们更新回正确的位置,并删除所有仅包含“冰柜%”作为数字的行 ╔══════════╦════════════════╦════════╦═════════════╗ ║ Location ║

我有一个SQL表,我想在其中从Number的值更新Location/Description的值

例如:表中的第二行应该有一个Loaction/description作为“冷冻柜Twnety”。像wise一样,最后两行的位置/描述应为“冷冻室三十”

数字列是一个ID,不知何故,该列被位置/描述值填充。我想将它们更新回正确的位置,并删除所有仅包含“冰柜%”作为数字的行

╔══════════╦════════════════╦════════╦═════════════╗
║ Location ║     Number     ║ Tissue ║ Description ║
╠══════════╬════════════════╬════════╬═════════════╣
║ NULL     ║ FREEZER TWENTY ║ NULL   ║ NULL        ║
║ NULL     ║ BRC13091917    ║ 13828  ║ NULL        ║
║ NULL     ║ Freezer Three  ║ NULL   ║ NULL        ║
║ NULL     ║ BRC13091922    ║ 13867  ║ NULL        ║
║ NULL     ║ FREEZER THIRTY ║ NULL   ║ NULL        ║
║ NULL     ║ BRC13112118    ║ 14815  ║ NULL        ║
║ NULL     ║ BRC13112118    ║ 14816  ║ NULL        ║
╚══════════╩════════════════╩════════╩═════════════╝

我想出了更好的方法。我用JavaScript和。只需将电子表格保存为CSV文件,用
作为分隔符,复制顶部的所有内容并运行它。您可以将输出复制回文本文件,另存为CSV并在Excel中打开


用编程语言解决这个问题要比用SQL容易得多。如果你有一个电子表格,你可以把它转换成CSV,使它更容易阅读。然后你可以填空并删除错误的行。这里有一个Perl解决方案

#!/usr/bin/perl
use strictures;
use Data::Dump;
use 5.012;

my $location;
while (my $row = <DATA>) {
  chomp $row;
  my @fields = split /;/, $row;
  if ($fields[1] =~ m/^FREEZER/i) {
    $location = $fields[1];
    next;
  }
  say join ';', $location, map { $_ // '' } @fields[1, 2, 3];
}

__DATA__
;FREEZER TWENTY;;
;BRC13091917;13828;
;Freezer Three;;
;BRC13091922;13867;
;FREEZER THIRTY;;
;BRC13112118;14815;
;BRC13112118;14816;

因为你很可能是在Windows上,你自己没有得出这个结论,你可能不知道该怎么做。不过,算法在任何编程语言中都是一样的。你可以在Excel中的VBA、PHP或任何其他语言中进行

  • 逐行读取文件
  • 将该行拆分为一个数组
  • 检查第2列中是否有位置
    • 如果是:
      • 将其保存在一个变量中,该变量在移动到下一行时保持不变
      • 继续下一行
    • 如果否:
      • 将空的第1列替换为保存的位置
    • 将该行写入新文件

    • 这里有一种在t-sql中实现的方法 (用表名替换您的表):


      SQL Server的哪个版本?行没有任何固有的顺序,看起来也没有任何适合排序的列?不可能。没有order by的select语句可能会按该顺序返回行,但这并不意味着行有顺序。您好,Martin,我正在使用SQL Server 2012它是在spreadhsee中提供给我的t、 问题是,“冷冻库%”是下一行n个位置/描述的值,直到我们到达另一个“冷冻库%”“。因此,有时它只是一行,有时是2、3等类似的内容。如果您在电子表格中有此内容,最好使用脚本语言来解决此问题,而不是尝试使用SQL。谢谢:-)。。我得到了它。。我只是试了一下,结果成功了。我有4-5个这样的文件。星期一他们都可以……-)
      FREEZER TWENTY;BRC13091917;13828;
      Freezer Three;BRC13091922;13867;
      FREEZER THIRTY;BRC13112118;14815;
      FREEZER THIRTY;BRC13112118;14816;
      
      With [Rows] 
      As
      (
          Select *, ROW_NUMBER() OVER (ORDER BY (select 0)) As RowNum
          From YourTable
      ),
      [Titles] 
      As
      (
          Select *
          From [Rows] r
          Where Tissue Is Null
      )
      Update x
      Set Location = t.Number, [Description] = t.Number
      From YourTable x, [Rows] r,  [Titles] t
      Where x.Tissue Is Not Null
      And r.Number = x.Number 
      And r.Tissue = x.Tissue
      And t.RowNum = ( Select MAX(RowNum) From [Titles] t2 Where r.RowNum > t2.RowNum )