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

时间:2014-01-25 22:52:18

标签: sql sql-server tsql

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

例如:表中的第二行应该具有Loaction / Descritption作为“Freezer Twnety”。同样明智的是,最后两行的位置/描述应为“Freezer Thirty”“。

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

╔══════════╦════════════════╦════════╦═════════════╗
║ 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        ║
╚══════════╩════════════════╩════════╩═════════════╝

2 个答案:

答案 0 :(得分:1)

我想出了一些更好的东西。我用JavaScript和put it in a jsfiddle构建了它。只需将您的电子表格保存为CSV文件,并以;作为分隔符,将所有内容复制到顶部<div>并运行它。您可以将输出复制回文本文件,另存为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;

输出如下:

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

由于你最有可能在Windows上,你自己没有得出这个结论,你可能不知道如何处理这个问题。不过,该算法在任何编程语言中都是相同的。你可以在Excel中的VBA,PHP或其他任何东西中完成它。

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

答案 1 :(得分:0)

这是在t-sql中执行此操作的一种方法 (将 YourTable 替换为您的表名):

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 )