2016-12-08 10 views
1

Ich habe vorhandene Daten wieZahlenreihe für neue Einträge erzeugen, die auf vorhandene Daten basierten

+-------+-----+----------+ 
| House | Pet | ItemCode | 
+-------+-----+----------+ 
| A  | Cat | ACat001 | 
| A  | Dog | ADog001 | 
| B  | Cat | BCat001 | 
| A  | Dog | ADog002 | 
+-------+-----+----------+ 

ich neuen Artikelcodes für neue Einträge von T-SQL wie

+-------+-----+----------+--------------------------------+ 
| House | Pet | ItemCode | ItemCodes supposed to generate | 
+-------+-----+----------+--------------------------------+ 
| A  | Cat | ????  | ACat002      | 
| C  | Dog | ????  | CDog001      | 
+-------+-----+----------+--------------------------------+ 

Bitte helfen Sie generieren mag.

+1

wie diese etwas tun, was auf diesem Ergebnis ist die Logik? – FLICKER

+0

wer hat diese Frage gewählt, können Sie uns bitte die erwartete Logik für diesen Ausgang wissen lassen! –

+0

Der Benutzer möchte die Logik erstellen, um neuen Objektcode für neu eingefügte Daten basierend auf Haus und Haustier zu generieren. So hat eine neu eingefügte Katze in Haus A einen ACat002-Objektcode, da eine Katze in Haus A bereits existiert. – ughai

Antwort

1

Ich würde vorschlagen, eine andere Spalte als Index zu halten, um Code in House, Pet und Index zu brechen und die itemcode von diesen erstellen und auch eine Identitätsspalte als Primärschlüssel in der Tabelle haben, die die Lösung machen würde einfacher und besser in der Leistung.

Wenn Sie die Tabelle so betrachten, können Sie zuerst den maximalen Index für jedes Haustier in einem Haus ermitteln und ihn dann zum Berechnen des nächsten Index und zum Aktualisieren der itemcode für die neu eingefügten Daten verwenden.

Tabelle Scripts und Inserts

CREATE TABLE HousePet 
    ([House] varchar(1), [Pet] varchar(3), [ItemCode] varchar(7)); 

INSERT INTO HousePet 
    ([House], [Pet], [ItemCode]) 
VALUES 
    ('A', 'Cat', 'ACat001'), 
    ('A', 'Dog', 'ADog001'), 
    ('B', 'Cat', 'BCat001'), 
    ('A', 'Dog', 'ADog002'); 

-- new rows inserted for which `ItemCode` is required 
INSERT INTO HousePet 
    ([House], [Pet], [ItemCode]) 
    VALUES 
    ('A', 'Cat', NULL), 
    ('C', 'Dog', NULL); 

aktualisieren SQL

;WITH HousePetIndex AS 
(
    SELECT House,Pet,MAX(CONVERT(INT,REPLACE(ItemCode,House + Pet,''))) as MaxIndex 
    FROM HousePet 
    WHERE ItemCode IS NOT NULL 
    GROUP BY House,Pet 
), HousePetInserted as 
(
    SELECT HP.House,HP.Pet,HP.ItemCode,ROW_NUMBER()OVER(PARTITION BY HP.House,HP.Pet ORDER BY HP.House) as ItemIndex 
    FROM HousePet HP 
    WHERE ItemCode IS NULL 
) 
UPDATE HP1 
SET ItemCode = HP1.House + HP1.Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex + ISNULL(HP2.MaxIndex,0)),3) 
FROM HousePetInserted HP1 
LEFT JOIN HousePetIndex HP2 
    ON HP1.House = HP2.House AND HP1.Pet = HP2.Pet 

SELECT * FROM HousePet 

Logic

  • Erhalten Sie für bestehende Daten pro Haus max Index und PET in HousePetIndex CTE
  • Identifizierung neue Reihen mit einem gewissen Index basierend auf row_number falls mehrere Zeilen für gleiches Tier und Haus eingefügt
  • Aktualisieren der itemcode für neue Zeilen basierend auf House, Pet und Index abgeleitet von max-Index und dem Index oder neue Zeilen

OUTPUT

House Pet ItemCode 
A Cat ACat001 
A Dog ADog001 
B Cat BCat001 
A Dog ADog002 
A Cat ACat002 
C Dog CDog001 

EDIT

Wenn Sie eine itemindex und eine Identitätsspalte ID, können Sie ItemCode als berechnete Spalte machen entscheiden hinzuzufügen.

CREATE TABLE HousePet 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    [House] varchar(1), 
    [Pet] varchar(3), 
    [ItemIndex] INT, 
    [ItemCode] AS (House + Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex),3)) 
); 

Sie können

UPDATE T 
SET ItemIndex = rn + MaxIndex 
FROM 
(
    SELECT ID,House,Pet,ItemIndex,ROW_NUMBER()OVER(PARTITION BY House,Pet ORDER BY ID ASC) rn 
    FROM HousePet 
    WHERE ItemIndex IS NULL 
)T 
INNER JOIN 
(
    SELECT House,Pet,ISNULL(MAX(ItemIndex),0) as MaxIndex 
    FROM HousePet 
    GROUP BY House,Pet 
) MaxIndexTable 
ON MaxIndexTable.House = T.House AND MaxIndexTable.Pet = T.Pet 
+0

Dank der Lösung. Also, die neue Tabelle sollte 4 Spalten House, Pet, Index und ItemCode (PrimaryKey), oder? –

+0

Ihr Primärschlüssel sollte eine separate ID-Spalte sein, vorzugsweise eine IDENTITY-Spalte. Wenn Sie eine Tabelle wie diese erstellen, kann Ihre 'ItemCode'-Spalte dann einfach eine berechnete Spalte basierend auf' House', 'Pet',' Index' sein und Sie müssen nur den 'Index' darin aktualisieren Fall. – ughai

+0

Ich verstehe es. Vielen Dank. –

Verwandte Themen