2016-07-02 4 views
0

ImageWollen der Zwischenaktualisierung in SQL

Wenn ItemCode, Farbe, Größe, Ständer, Rack1 Spiel dann die Num Spalte inkrementelle Werte benötigt anstelle von NULL zu nehmen. Dies bedeutet, dass für die markierten Zeilen die Werte 1 und 2 und für andere (nicht wiederholte) Datensätze der Wert 1 benötigt wird.

+0

Welche RDBMS ist das? Bitte fügen Sie ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' verwenden - oder etwas ganz anderes. –

+0

Brauchen Sie inkrementelle nur, wenn alle Spalten gleich sind? –

+0

Ja, möchte inkrementell sein, wenn alle Spalten gleich sind. –

Antwort

0

Tabellenschema:

CREATE TABLE Items 
    (
     ItemCode VARCHAR(10), 
     Color INT, 
     Size VARCHAR(10), 
     Rack VARCHAR(10), 
     RACK1 INT, 
     NUM INT 
    ) 

Daten:

INSERT INTO Items VALUES 
('LY-164', 1, 'L', 'LT', 74, NULL), 
('LY-164', 1, 'M', 'LT', 75, NULL), 
('LY-164', 1, 'XL', 'LT', 67, NULL), 
('LY-164', 1, 'XXL', 'LT', 70, NULL), 
('LY-178', 1, 'L', 'LT', 104, NULL), 
('LY-178', 1, 'L', 'LT', 109, NULL), 
('LY-178', 1, 'M', 'LT', 122, NULL), 
('LY-178', 1, 'M', 'LT', 122, NULL), 
('LY-178', 1, 'XL', 'LT', 108, NULL), 
('LY-178', 1, 'XL', 'LT', 109, NULL), 
('LY-178', 1, 'XXL', 'LT', 108, NULL) 

Wenn Sie nicht Primärschlüssel in der Tabelle haben Sie können Sie dieses verwenden. Hier füge ich zuerst ein und lösche dann die Nullwerte.

; WITH CTE AS 
(
    SELECT ItemCode, Color, Size, Rack, Rack1 
    , ROW_NUMBER() OVER (PARTITION BY ItemCode, Color, Size, Rack, Rack1 ORDER BY ItemCode, Color, Size, Rack, Rack1) AS RN 
    FROM Items 
) 
INSERT INTO Items 
SELECT * FROM CTE 

DELETE FROM Items WHERE NUM IS NULL 

SELECT * FROM Items 

Dies ist ein weiterer Ansatz (Quirky-Update, eine der schwarzen Magie in SQL)

DECLARE @ItemCode VARCHAR(10) 
DECLARE @Color INT 
DECLARE @Size VARCHAR(10) 
DECLARE @Rack VARCHAR(10) 
DECLARE @RACK1 INT 
DECLARE @NUM INT = 1 

UPDATE A 
SET 
@NUM = IIF(@ItemCode IS NULL OR @ItemCode <> A.ItemCode OR @Color <> A.Color OR @Size <> A.Size OR @Rack <> A.Rack OR @RACK1 <> A.RACK1, 1, @Num + 1), 
@ItemCode = A.ItemCode, 
@Color = A.Color, 
@Size = A.Size, 
@Rack = A.Rack, 
@RACK1 = A.RACK1, 
A.Num = @NUM 
FROM Items A 

SELECT * FROM Items 

Antwort

LY-164 1 L LT 74 1 
LY-164 1 M LT 75 1 
LY-164 1 XL LT 67 1 
LY-164 1 XXL LT 70 1 
LY-178 1 L LT 104 1 
LY-178 1 L LT 109 1 
LY-178 1 M LT 122 1 
LY-178 1 M LT 122 2 
LY-178 1 XL LT 108 1 
LY-178 1 XL LT 109 1 
LY-178 1 XXL LT 108 1 
+0

Ich sehe nichts, das spezifisch für 'SQL SERVER 2012 +' ist, sollte mit 'SQL SERVER 2008' sowie –

+0

arbeiten Dank Tanjim, es funktioniert. –

+0

Prost. Ich stimme für die schrulligen – Esty