2017-02-14 18 views
0

フラットtxtファイルからテーブルを作成できましたが、このレイアウトのためタイムスタンプが適切な場所にありません。ファイルは次のように読み取ります同じテーブルの結合を使用したSQL Serverの更新

13-Feb-17 01:14 

N1 SUNDRY 331/6203 ASTOCK 000000 PICK 111111 0  3 0 0 268   

13-Feb-17 01:15 

N1 SUNDRY 397/5747 ASTOCK 000000 PICK 111111 0  2 0 0 268   

13-Feb-17 06:09 

MP GRENDZ 606/0484  000000   060472 0  0 0 0 193 
A5 GRENDZ 606/0484  000000   060472 1 26 5 0 3 
MP GRENDZ 346/9789  000000   060704 1  0 5 0 304 
A5 GRENDZ 346/9789  000000   060704 1  8 5 0 3 

私は新しいテーブルにインポートするときに:

-- SELECT DATABASE 
    USE [CHDS_Sandbox] 
    GO 
    -- TRUNCATE TABLE 
    TRUNCATE TABLE [dbo].[LogScan] 
    GO 
-- INSERT NEW DATA 
INSERT INTO [dbo].[LogScan] 
      (move_type, program, cat, from_loc, pallet_no, to_loc, grds, pallets, items, tme, clk_num, id_num, movement_key, move_stamp, t_stamp) 
SELECT 
-- 0 AS id_als, 
CASE WHEN SUBSTRING(Field1,1,2) BETWEEN '0' AND '99' THEN '' ELSE SUBSTRING(Field1,1,2) END AS move_type, 
CASE WHEN SUBSTRING(Field1,4,6) LIKE '%-%' THEN '' ELSE SUBSTRING(Field1,4,6) END AS program, 
CASE WHEN SUBSTRING(Field1,11,8) LIKE '%:%' THEN '' ELSE SUBSTRING(Field1,11,8) END AS cat, 
SUBSTRING(Field1,20,6) AS from_loc, 
0+SUBSTRING(Field1,27,6) AS pallet_no, 
SUBSTRING(Field1,35,6) AS to_loc, 
0+SUBSTRING(Field1,42,6) AS grds, 
0+SUBSTRING(Field1,49,4) AS pallets, 
0+SUBSTRING(Field1,54,5) AS items, 
0+SUBSTRING(Field1,60,3) AS tme, 
0+SUBSTRING(Field1,64,3) AS clk_num, 
0+SUBSTRING(Field1,68,4) AS id_num, 
SUBSTRING(Field1,72,9) AS movement_key, 
CASE 
    WHEN SUBSTRING(Field1,4,3)='JAN' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='FEB' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='MAR' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='APR' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='MAY' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='JUN' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='JUL' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='AUG' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='SEP' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='OCT' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='NOV' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='DEC' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
END AS move_stamp, 
GETDATE() AS t_stamp 
FROM [CHDS_Staging].[dbo].[csv_ImportedData] 
WHERE SUBSTRING(Field1,11,8) LIKE '%/%' OR SUBSTRING(Field1,11,5) LIKE '%:%' AND SUBSTRING(Field1,27,6) NOT LIKE '%:%' 
GO 

が、これは私に与える:enter image description here

を私はそれぞれに移動スタンプを必要としますそれが変化するまでその下にある細胞。

これについての助力は素晴らしいことです。

これは、MySQLで働いていたものです:

UPDATE dbo.LogScan t1 
    JOIN (
    SELECT id_als, @s:=IF(move_stamp IS NULL, @s, move_stamp) move_stamp 
    FROM (SELECT * 
    FROM dbo.LogScan 
    ORDER BY id_als) r, 
    (SELECT @s:='') t 
    ) t2 
    ON t1.id_als = t2.id_als 
    SET @t1.move_stamp = t2.move_stamp; 

答えて

0

私は以下のクエリを書かれていると私は私がすべての構文エラーがないことを願っています。 これが有効かどうかを確認してください。 is-als列がint列であると仮定しました。あなたは、行1,3,5,10などのような空の行を削除したい場合も あなたは

WITH StampCTE AS (
     SELECT ([id-als]+1) AS id-als,move_stamp 
     FROM [dbo].[LogScan] 
     WHERE move_stamp IS NOT NULL 
    ) 
    SELECT 
     T1.id_als, 
     T1.move_type, 
     T1.program, 
     T1.cat, 
     T1.from_loc, 
     T1.pallet_no, 
     T1.to_loc, 
     T1.grds, 
     T1.pallets, 
     T1.items, 
     T1.tme, 
     T1.clk_num, 
     T1.id_num, 
     T1.movement_key, 
     T1.move_stamp , 
     T2.move_stamp AS [NEW COLUMN MOVED] , 
     T1.t_stamp 
    FROM [dbo].[LogScan] T1 
    LEFT JOIN StampCTE T2 ON T1.id_als = T2.id-als 
    --WHERE RTRIM(LTRIM(T1.move_type)) <> '' 

更新の行を更新するには、このクエリを使用することができ、現在のクエリ にコメントしている場合の条件を含めます声明:

I would first run the select and if you see that thats what you like then use the below: 



    WITH StampCTE AS (SELECT ([id_als]+1) AS id_als,move_stamp 
    FROM [dbo].[LogScan] WHERE move_stamp IS NOT NULL 
    ) 
    UPDATE T1 
    SET T1.move_stamp = T2.move_stamp 
    FROM [dbo].[LogScan] T1 
    LEFT JOIN StampCTE T2 ON T1.id_als = T2.id_als 

以下の更新ステートメントは背後の行からそれぞれの行を更新しますが、データのたくさん持っている場合、それは遅いかもしれません:

DECLARE @ID INT; 

WHILE (SELECT COUNT(*) FROM [dbo].[LogScan] WHERE move_stamp IS NULL) > 0 
BEGIN 

    SELECT TOP(1) @ID = id_als from [dbo].[LogScan] 
    WHERE move_stamp IS NULL 
    ORDER BY id_als; 

    WITH StampCTE AS ( 
    SELECT DISTINCT move_stamp 
    FROM [dbo].[LogScan] WHERE id_als = @ID-1 
    ) 
    UPDATE [dbo].[LogScan] T1 
    SET T1.move_stamp = StampCTE.move_stamp 

END 


SELECT * FROM [dbo].[LogScan] 
+0

これは私が行くだろう更新ステートメント?それとも、挿入物に追加するだけですか? –

+0

ただ投稿を更新しました – BSAMEI

+0

こんにちはBSAMEIは閉鎖していますが、それをすべて埋めるのではなく、INSERTで作業するにはこのfuctionが必要です。または、その直後にUPDATEを実行する必要があり、move_stampにとどまる必要があります。 –

関連する問題