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