# Oracle SQL - Teilmengen/Gruppen einer Liste jeweil mit fortlaufender Nummer versehen?



## Herr_M (17. April 2014)

Hallo Zusammen,

Ich habe in einer Tabelle eine Liste von "Mitarbeitern", diese sind verschiedenen "Abteilungen" zugeordnet, jetzt ist in der Tabelle eine Neue Spalte "ID" hinzugekommen. Jetzt muss initial diese neue Spalte Nummer mit einer pro Abteilung fortlaufenden Nummer pro Abteilung mit einem SQL Skript gefüllt werden. 

Also z.B. So

```
Abteilung A | 1 | Max Mustermann
Abteilung A | 2 | Heinz Mustermann
Abteilung A | 3 | Lisa Mustermann
Abteilung B | 1 | Hans Dampf
Abteilung B | 2 | Lisa Müller
Abteilung C | 1 | Herr M
```

Hat jemand ne Idee wie man das lösen könnte? Mein Kollege und ich sind mit unseren bisherigen Ideen leider gescheitert


----------



## Yaslaw (17. April 2014)

Erstelle eine Sequenz
Mach ein UPDATE mit MY_SQEUNZE.NEXT als Wert

Das ganze istungetestet und ohne Gewehr


----------



## Herr_M (17. April 2014)

And die Sequenz hab ich auch schon gedacht, dann hätte ich aber eine fortlaufende Nummer für alle Einträge... ich brauch aber eine pro Abteilung


----------



## MPr (17. April 2014)

wenn ich die Anforderung richtig verstehe:


```
drop table t;

create table t (
    dept_name varchar2(20)
  , id number
  , emp_name varchar2(20)
);

insert into t(dept_name, emp_name) values('Abteilung A', 'Max Mustermann');
insert into t(dept_name, emp_name) values('Abteilung A', 'Heinz Mustermann');
insert into t(dept_name, emp_name) values('Abteilung A', 'Lisa Mustermann');
insert into t(dept_name, emp_name) values('Abteilung B', 'Hans Dampf');
insert into t(dept_name, emp_name) values('Abteilung B', 'Lisa Müller');
insert into t(dept_name, emp_name) values('Abteilung C', 'Herr M');

select * from t order by 1, 2;

DEPT_NAME                    ID EMP_NAME
-------------------- ---------- --------------------
Abteilung A                     Max Mustermann
Abteilung A                     Heinz Mustermann
Abteilung A                     Lisa Mustermann
Abteilung B                     Hans Dampf
Abteilung B                     Lisa Müller
Abteilung C                     Herr M

merge into t dest
using (select dept_name
            , row_number() over(partition by DEPT_NAME order by EMP_NAME) rn
            , emp_name
         from t) src
on (dest.dept_name = src.dept_name and dest.emp_name = src.emp_name)
when matched then update set dest.id = src.rn;

select * from t order by 1, 2;

DEPT_NAME                    ID EMP_NAME
-------------------- ---------- --------------------
Abteilung A                   1 Heinz Mustermann
Abteilung A                   2 Lisa Mustermann
Abteilung A                   3 Max Mustermann
Abteilung B                   1 Hans Dampf
Abteilung B                   2 Lisa Müller
Abteilung C                   1 Herr M
```


----------



## Herr_M (17. April 2014)

Danke , die Anforderung hast du richtig verstanden... und deine vorgeschlagene Lösung passt daher genau. Da mein Kollege und ich nur Datenbankgrundwissen haben und uns das "merge" bis dato unbekannt war, wären wir wahrscheinlich nie auf so eine "einfache" Lösung gekommen.

Den select hatten wir "so ähnlich" schon, aber unser Problem war immer wie bekommt man das ergebnis davon dann als "Update" in die Datenbank. Alle Versuche endeten bei uns damit, dass die ID 1 für alles vergeben wurde


----------

