我有一个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 ║
╚══════════╩════════════════╩════════╩═════════════╝
答案 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 :(得分: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 )