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
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. –
Brauchen Sie inkrementelle nur, wenn alle Spalten gleich sind? –
Ja, möchte inkrementell sein, wenn alle Spalten gleich sind. –