2010-12-22 21 views
1

Ich habe eine DataTable, die die Spalte Gerätetyp, DeviceName und Label hat.Gespeicherte Prozedur

Für jeden deviceType können mehrere Geräte vorhanden sein. Also ich möchte die gespeicherte Prozedur schreiben, die Label-Spalte als 01,02,03,04 .... für jede DeviceName und DeviceType Kombination füllen wird.

Beispiel: -

DeviceName DeviceType  **Label** 

Probe1   1   01 
Probe2   1   02 
Probe3   1   03 
Tank1    2   01 
Tank2    2   02 
Pump1    3   01 
Pump2    3   02 

Antwort

1

Mit der Annahme, dass Device eindeutig zuzuordnen sind, können Sie ROW_NUMBER wie folgt verwenden:

DECLARE @Data TABLE (DeviceName VARCHAR(50), DeviceType INTEGER, Label CHAR(2)) 
INSERT @Data VALUES ('Probe1', 1, '') 
INSERT @Data VALUES ('Probe2', 1, '') 
INSERT @Data VALUES ('Probe3', 1, '') 
INSERT @Data VALUES ('Tank1', 2, '') 
INSERT @Data VALUES ('Tank2', 2, '') 
INSERT @Data VALUES ('Pump1', 3, '') 
INSERT @Data VALUES ('Pump2', 3, '') 

UPDATE d 
SET d.Label = RIGHT('0' + CAST(x.RowNo AS VARCHAR(2)), 2) 
FROM @Data d 
    JOIN (
     SELECT DeviceName, ROW_NUMBER() OVER (PARTITION BY DeviceType ORDER BY DeviceName) AS RowNo 
     FROM @Data 
    ) x ON d.DeviceName = x.DeviceName 

SELECT * FROM @Data 
3

Werfen Sie einen Blick auf mit ROW_NUMBER

SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY DeviceType ORDER BY DeviceName) Label 
FROM Table 

EDIT

Hier ist ein kleines Beispiel UPDATE dann:

DECLARE @Table TABLE(
     DeviceName VARCHAR(20), 
     DeviceType INT, 
     Label VARCHAR(20) 
) 

INSERT INTO @Table SELECT 'Probe1',1,'' 
INSERT INTO @Table SELECT 'Probe2',1,'' 
INSERT INTO @Table SELECT 'Probe3',1,'' 
INSERT INTO @Table SELECT 'Tank1',2,'' 
INSERT INTO @Table SELECT 'Tank2',2,'' 
INSERT INTO @Table SELECT 'Pump1',3,'' 
INSERT INTO @Table SELECT 'Pump2',3,'' 


;WITH Vals AS (
     SELECT DeviceName, 
       DeviceType, 
       ROW_NUMBER() OVER(PARTITION BY DeviceType ORDER BY DeviceName) Label 
     FROM @Table 
) 
UPDATE @Table 
SET  Label = Vals.Label 
FROM @Table t INNER JOIN 
     Vals ON t.DeviceName = Vals.DeviceName 
       AND t.DeviceType = Vals.DeviceType 
SELECT * 
FROM @Table 
+0

+1, schlugen mich darauf! – AdaTheDev

+0

+1 Gute Antwort! – sv88erik

+0

danke astander, aber ich möchte auch die Anzahl in das Etikett einfügen –