2014-01-25 94 views
0

我有一個SQL表,我想從Number的值更新位置/描述的值。TSQL:如何將一列中的值從前一行復制到另一列中的下一行

對於例如:表格中的第二行應該具有「Freezer Twnety」的Loaction/Descritption。像明智的最後2行應該有位置/說明作爲「冷櫃三十」「

NUMBER列是一個ID和不知何故該列由位置/說明值填充我想更新回他們到正確的地方並刪除只包含「冷凍%」 AS號的所有行。

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

什麼版本的SQL Server?行也沒有任何固有的順序,它看起來好像你有任何合適的列排序? –

+0

不可能。沒有order by的select語句可能按照該順序返回了行,但這並不意味着這些行有順序。 – Paparazzi

+0

嗨馬丁,我正在使用SQL Server 2012 – Daman

回答

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中使用VBA或其他方法。

  • 由線讀取的所述文件中的行
  • 分割線成一個數組
  • 檢查,如果有在第2列
    • 如果是一個位置:
      • 節省,在可變當移動到下一行時保持完好
      • 前進到下一行
    • 如果沒有:
      • 與保存的位置更換空1列
    • 行寫出到一個新的文件
+0

謝謝:-) ..我知道了..我只是試過了,它工作。我有這樣的4-5個文件。週一將爲他們做所有的事情。:-) – Daman

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) 
相關問題