2017-02-14 5 views
0

Ich habe es geschafft, meine Tabelle aus der Flat-TXT-Datei zu erstellen, aber aufgrund des Layouts ist der Zeitstempel nicht an der richtigen Stelle. Die Datei liest sich wie folgt:SQL Server Update mit Join aus der gleichen Tabelle

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 

Also, wenn ich in der neuen Tabelle importieren mit:

-- 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 

aber das gibt mir: enter image description here

ich den Umzug Stempel in jedem der Notwendigkeit Zellen darunter, bis es sich ändert.

Jede Hilfe dazu wäre großartig.

Dies ist, was in MySQL gearbeitet:

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; 

Antwort

0

ich die unten Abfrage geschrieben haben und ich hoffe, dass ich habe keine Syntaxfehler. überprüfen Sie bitte, ob dies für Sie funktioniert. Ich nahm an, dass Ihre Is-Als-Spalte eine Int-Spalte ist. , wenn Sie auch wie Zeile 1,3,5,10 usw. die leeren Zeilen entfernen möchten sind dann die in dem Zustand, die derzeit in der Abfrage kommentiert wird Sie diese Abfrage die Zeilen verwenden können

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)) <> '' 

Update zu aktualisieren Erklärung:

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 

die folgende Update-Anweisung aktualisiert jede Zeile aus einer Reihe hinter, könnte es langsam sein, wenn Sie eine Menge Daten haben:

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

Wo würde dies gehen i die Update-Anweisung? Oder füge ich es einfach zum Einsatz hinzu? –

+0

Just updated the post – BSAMEI

+0

Hallo BSAMEI es ist in der Nähe, aber es füllt nicht alles in ADN Ich würde diese Funktion brauchen, um auf der INSERT oder lassen Sie es die UPDATE direkt danach und es muss in der move_stamp bleiben. –

Verwandte Themen