Frage von Ayleen1990, 160

Schleifen in SQL?

Ich habe eine Tabelle, in der es verschiedene Namen und Codes gibt. Manchmal gibt es zum gleichen Namen verschiedene Codes. Die Tabelle sieht so aus:

Anna | CodeX Anna | CodeY

Ich will eine View erstellen, die wenn der gleiche Name mit verschiedenen Codes vorkommt, in die Zelle des Namen die Anzahl angibt, wie oft der Name bisher schon vorkam.

Die View sollte das anzeigen: Anna_1 | CodeX Anna_2 | CodeY

Hierbei besteht für mich die Schwierigkeit, dass das Programm mitzählen soll, wie oft hier im Beispiel der Name Anna vorkommt und daraufhin die Zahlen „_1“ bis „_n“ an den Namen anfügt.

Ich benutze Oracle SQL Version 10 Redundanz ist hier ausgeschlossen, d.h. es gibt nie den gleichen Datensatz zweimal.

Danke für jede Hilfe :)

Antwort
von seidlerweb, Business, 114

Vorausgesetzt ich verstehe dich richtig und deine Tabelle sieht etwa so aus:

CREATE TABLE `namen` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45),
`code` varchar(45),
PRIMARY KEY (`ID`)
);

dann solltest du hiermit zum Ziel kommen:


SELECT
if(name != @temp , @rownum := 1, @rownum := @rownum + 1) AS nm,
@temp := name AS temp,
name,
code,
concat(name, '_', @rownum)
FROM (SELECT @rownum := 0) AS ROWNUM, namen
ORDER BY name;

Ich ermittle alle Datensätze der Tabelle und sortiere nach Namen, jetzt bilden alle Datensätze mit gleichen Namen einen Block. Die Variable rownum wird einfach bei jedem Datensatz hochgezählt, aber nur, wenn sich der Namen ändert, sonst wieder auf 1 zurück gesetzt. Daher speichere ich auch den gerade ermittelten Namen in der Variablen temp zwischen.

Naja und concat setzt dir einfach den Namen neu zusammen, so wie du es beschrieben hast.



Kommentar von geri3d ,

ich wusste gar nicht, dass SQL sölche konstrukte zulässt aber man lernt nie aus. DH

Kommentar von seidlerweb ,

das geht mir genauso :-)

Antwort
von geri3d, 113

Frag mich jetzt nicht wie aber vielleicht hilft ein Group by. Wie man die Zahl anhängen kann weiss ich auch nicht.

Kommentar von seidlerweb ,

GROUP BY war zwar auch mein erster Gedanke, aber das geht nicht, weil sie ja alle Datensätze pro Gruppierung braucht und in die View schreiben will. 

Die Zahl oder was auch immer kann einfach mit CONCAT() angehängt werden. Das Problem ist eher die Numerierung pro gleichen Namen zu ermitteln. 

Kommentar von Minilexikon ,

Ein Group by geht schon. Du müsstest nur zwei Querys daraus machen. Einer, der die Zahl ermittelt, einer der alle Werte zurück liefert und ein kleines Script, welches ein Objekt daraus aufbaut.

Keine passende Antwort gefunden?

Fragen Sie die Community