mastertulle
Goto Top

Hilfe bei SQL Script

Hallo liebe Forenmitglieder und Entwickler,

ich habe folgendes Problem:

In unserer Datenbank gibt es mehrere Kunden die mehrmals vorhanden sind.

Ich möchte nun nur einen einzelnen Kunden haben. Dieser soll eine neue eindeutige ID bekommen, im Moment hat der gleiche Kunde immer eine andere ID
Bsp:

Name Artikel ID
Klaus Müller Mainboard ASUS 1255
Klaus Müller Prozessor Athlon X4 258

Dies liegt daran, das der Kunde als Neukunde jedesmal aufgenommen wurde.

Nun plane ich folgendes Bild:

Name Artikel Kunden_ID
Klaus Müller Mainboard ASUS 1
Klaus Müller Prozessor Athlon X4 1
Beate Fuchs Laptop 2
Bernd Maler Regal 3
Urusla Brückenkopf Laptop 4
Urusla Brückenkopf Blumenvase 4


Da es mehr als 150000 Kunden sind die dies betrifft suche ich Hilfe bei dem SQL Script.
Da die Telefonnummer des Kunden eindeutig ist habe ich gedacht, diese zu zählen wo die Anzahl > 1 ist
und dann die ID zu vergeben als fortlaufende Nummer, sobald ein neuer Kunde kommt muss der Zähler
um 1 erhöht werden, also wenn sich die Telefonnummer ändertl.
ich hoffe es ist halbwegs verständlich.

Vielen lieben Dank im Voraus

Sven

Content-Key: 269928

Url: https://administrator.de/contentid/269928

Printed on: May 4, 2024 at 00:05 o'clock

Member: Biber
Biber Apr 22, 2015 updated at 22:24:17 (UTC)
Goto Top
Moin mastertulle,

das ist nicht ganz zu Ende gedacht, fürchte ich.

Erstens - und ziemlich am Wichtigsten: von welcher Datenbank reden wir (Oracle, mySQL, MSSQL..). ?

Zweitens - die Bereinigung bzw. Migration der vorhandenen Daten ist eine Sache.
Interessanter ist der Punkt, wie denn die Applikation/das Frontend in Zukunft feststellen soll, ob eine neue ID vergeben werden soll oder bereits eine brauchbare vorhanden ist.

So, wie du es sehr, sehr optimistisch darstellst ist eine Telefonnummer etwas Eindeutiges.
Das deckt sich überhaupt nicht mit meiner Wahrnehmung.

Wenn ich irgendwo in einem Formular Name, Vorname und Telefonnummer angeben muss, dann ergibt das je nach Wochentag und Laune
"Mustermann", "Max", "0815/47110022"
"Mustermann", "Max", "(0815) 47110022"
"Mustermann", "Max", "(049) 815 47110022"
"Mustermann", "Max", "(0049) 815 47110022"
"Mustermann", "Max", "+49 815 47110022"
"Mustermann", "Max", "0815 / 47 11 00 22"
"Mustermann", "Max", "0815 / 471 100 22"
...

In keinem dieser Fälle hätte ich etwas richtig Falsches angegeben und jeder telefonische Rückfrageversuch würde mein Telefon klingeln lassen.
Aber dieser Max Mustermann hätte bei dir mehrere IDs.

Heisst:
Ich halte einerseits die Telefonnummer für ungeeignet (da eben nicht eindeutig im unnormierten Zustand).
Andererseits: Wenn du mich davon überzeugst, dass die Telefonnummer bei dir eindeutig ist, dann... okay, ist sie eben eindeutig.
WTF brauchst du dann eine künstliche ID?

Grüße
Biber
Member: mastertulle
mastertulle Apr 26, 2015 at 13:18:27 (UTC)
Goto Top
Hallo Biber,

erstmal danke für diene Antwort.

Es handelt sich um MS-SQL Server 2014.
Telefon ist eindeutig!
ich brauche die neue ID um eine 1-n Beziehung herstellen zu können.
Im Moment ist es eine 1-1 Beziehung.
Ich will im späteren Verlauf Formulare erzeugen, die mir je Kunde alle Artikel auflistet.

Ich hoffe es war verständlich.

LG

Sven
Member: Biber
Biber Apr 26, 2015 at 13:56:43 (UTC)
Goto Top
Moin mastertulle,

okay, wenn du es sagst, dann nehme ich mal die Telefonnummer als eindeutig an.

Dann würde dir dieses Statement deinen Kundenstamm incl.neu generierter KundenID liefern:
SELECT ROW_NUMBER() OVER(ORDER BY name, telnr) AS NewKundenID, 
    name, telnr, Artikel 
FROM Bestellungen
wobei der Tabellenname geraten ist und Artikel nur als Dekoration angezeigt wird.

Wenn du bei deinen 150000 Kunden allerdings auch nur 0,001 Prozent dabei hast, die aus ethischen oder religiösen Gründen keine Telefonnummer haben (Telnr IS NULL), dann brauchst du eine Verfeinerung. face-wink

Andernfalls kannst du dir deinen Kundenstamm neu anlegen:
CREATE table Kundenstamm as
Select distinct Kunden_id , Name, TelNr from (
SELECT ROW_NUMBER() OVER(ORDER BY name, telnr) AS Kunden_ID, 
    name, telnr 
FROM Bestellungen
) x

Ungetestet und nur als Skizze zu verstehen.
Oder (ich habe nicht nachgeschaut, ob MSSQL ein "CREATE TABLE AS SELECT.." implementiert hat) eine leere Tabelle "Kundenstamm" anlegen und mit obigem abgewandeltem Statement mit "INSERT INTO Kundenstamm" füllen.

Eine weitere Variante wäre die Definition der KUNDE_ID als "Autowert".
Dann kannst du eine neu angelegte "Kundenstamm" -Tabelle füllen mit den DISTINCT-Werten Name, Telnr oder einem Resultset Name, Telnr GROUP by name, telnr, jeweils ohne Angabe der Kunden_ID, die ja generiert wird.

In beiden Fällen wäre es allerdings unüblich, die Kunden_ID bei 1 anfangen zu lassen - ein Kunde mit der Kunden_Id 1 wird auf einen Treuerabatt von 25% bestehen.
Lass die also von dem Wert 18523 an beginnen.

Grüße
Biber