Seite 1 von 1
SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Sa, 16.02.2008 09:51
von heinz_ketchup
Hallo,
ich habe eine Prozedur, die aus einer Tabelle Datensätze auslesen soll und Teile davon in eine andere Tabelle reinschreiben soll.
In der Ausgangstabelle stehen Konten und die dazugehörigen Monatswerte:
Konto, Saldo_1, Saldo_2, Saldo_3, ... ,Saldo_12
In der Zieltabelle sollen die Datensätze so aussehen:
Konto, Saldo_1, Monat_1, Jahr
Konto, Saldo_2, Monat_2, Jahr
Konto, Saldo_3, Monat_3, Jahr
So, meine Prozedur sieht bislang so aus:
Code: Alles auswählen
BEGIN
DECLARE monat INT;
DECLARE jahr INT;
DECLARE saldo CHAR;
SET monat = 1;
SET jahr = 2007;
SET saldo = 'saldenliste_original.Saldo_ ';
WHILE monat < 13 DO
INSERT INTO saldenliste ( sl_ktonr, sl_monatssaldo, sl_monat, sl_jahr)
SELECT saldenliste_original.Konto,
saldo & monat, # ich glaube hier liegt der Fehler mit den 2 verschiedenen Datentypen CHAR & INT
monat,
jahr
FROM saldenliste_original;
SET monat = monat + 1;
END WHILE;
END
Ich lass einfach die Variable 'monat' hoch zählen und damit wird dann das Feld mit dem entsprechenden Monatssaldo ausgewählt.
Das funktioniert auch soweit, was die Struktur anbelangt. Leider bekomme ich keine Werte übergeben.
Ich glaube es liegt daran, dass ich die Variable 'saldo' CHAR mit der Variable 'monat' INT verknüpfen möchte. Wie kann ich meine Variable 'monat' als CHAR definieren und diese trozdem hoch zählen lassen?
fragt Werner
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Sa, 16.02.2008 15:18
von komma4
Teste, ob der Sub-SELECT alleine funktioniert.
Wenn Du eine Typumwandlung brauchst, dann nehme
CAST(), zum Zusammenfügen dann
CONCAT() [beides in der
HSQLDB-Dokumentation]
Warum verwendest Du nicht eine
GROUP BY Klausel zum Gruppieren der Monatsergebnisse?
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Sa, 16.02.2008 17:41
von heinz_ketchup
Hallo komma4,
vielen Dank für Deine Antwort! Nach CAST() habe ich gesucht.
Das macht genau das was ich mir vorgestellt habe. Leider funktioniert es nicht. SQL schreibt das Ergebnis aus meinem CONCAT-Befehl in die Zieltabelle, aber nicht den Inhalt des Feldes, den ich ja so übergeben wollte. Ich glaube ich bin da mit meinem Ansatz auf dem Holzweg. SQL braucht eine klare Feldbezeichnung und nichts gebasteltes.
Wie könnte ich mit GROUP BY weiter kommen? Es gibt ja nichts zusammen zu fassen. In meiner Ausgangstabelle sind es ja schon die Summenwerte pro Konto und Monat. Ich möchte lediglich in meiner Zieltabelle das Konto, den Wert des Monats, den Monat und das Jahr stehen haben.
fragt Werner
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: So, 17.02.2008 02:26
von komma4
Sorry - ich kenne mich mit Prozedur-Syntax nicht aus...
...fehlen da vielleicht quotes zur korrekten Felderkennung, nach dem CAST() ?
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: So, 17.02.2008 18:48
von Barlee
Hallo Werner,
mit folgendem sollte es anstelle von "saldo & monat," funktionieren:
Gruß Barlee
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Mo, 18.02.2008 21:42
von heinz_ketchup
@ komma4, danke für den Versuch!
1. Prozedur-Syntax ist wie SQL-Syntax, einziger Unterschied (hoffentlich mach' ich jetzt da nichts falsch

) ist, dass Du bei einer Prozedur, Deine Anweisungen mit BEGINN und END "einschliessen" musst. # das ist eine stark verkürzte Anfängerdarstellung von mir ! #
2. Ich wüsste jetzt nicht, wie oder wo ich die Quotes da reinwurschteln sollte?
@ Barlee, auch danke für Deine Hilfe!
concat(saldo,cast(monat as char(2))),
funktioniert leider nicht. Es werden keine Werte aus den angesprochenen Feldern eingefügt. Ergebnis ist 0 in allen Feldern.
Was bewirkt eigentlich die (2) hinter der CHAR Definition?
Ich glaube immer noch, dass es daran liegt:
SQL braucht eine klare Feldbezeichnung und nichts gebasteltes.
Ich möchte gerne nochmal die Anregung von komma4 aufgreifen:
Warum verwendest Du nicht eine GROUP BY Klausel zum Gruppieren der Monatsergebnisse?
Leider fehlt mir die Idee, wie ich an der Stelle mit Group by weiter komme.
Also, ich bin gerne für jede Anregung zu meiner Problemlösung dankbar.
Schöne Grüße
Werner
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Mo, 18.02.2008 21:51
von Barlee
Hallo Werner,
ich muss nochmal fragen.
Verwendest Du mySQL oder HSQL?
Mein Syntax bezog sich auf mySQL. Damit konnte ich Dein Beispiel erfolgreich nachstellen...

- Bild_3.jpg (24.41 KiB) 1863 mal betrachtet
Welche Datentypen verwendest Du in den einzelnen Spalten Deiner beiden Tabellen "saldenliste" und "saldenliste_original"???
Was bewirkt eigentlich die (2) hinter der CHAR Definition?
CHAR(2) - über 2 wurde die Länge deklariert, die der CHAR Wert in diesem Fall aufnehmen kann, (für Monat 1 bis 12 werden maximal zwei Zeichen benötigt)
Gruß Barlee
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Do, 21.02.2008 09:29
von heinz_ketchup
Hallo Barlee,
vielen Dank für Deine Mühe!
1. ich benutze MySQL
2. ich habe leider wieder mal mein Problem nicht ausführlich genug beschrieben. Sorry!
Dein Lösungsansatz kommt dem gewünschten Ergebnis schon sehr nahe. Toll!
Nur sollten anstatt der Feldbezeichnungen "saldenliste_original.Saldo_8" der entsprechende Wert, der sich für das Konto 4563 im August ergeben hat in meiner Tabelle stehen, z.B. 2.354,31 €.
Ich möchte meine Prozedur nutzen, um eine quere Saldenliste mit einer Kontennummer und 12 Monatswerten, in einzelne Datensätze pro Monat aufzulösen, so wie Du es in Deiner Lösung schon fast erreicht hast.
Welche Datentypen verwendest Du in den einzelnen Spalten Deiner beiden Tabellen "saldenliste" und "saldenliste_original"???
Hier die Datentypen, die in beiden Tabellen "saldenliste_original", "saldenliste" gleich sind:
Konto INTEGER # INT, damit ich später bei Abfragen mit <, >, = die richtigen Werte zurück bekomme #
Saldo_1 DECIMAL # der Kontensaldo pro Monat ist ein Euro-Wert #
Saldo_2 DECIMAL
...
Saldo_12 DECIMAL
Monat INTEGER # INT, damit ich später bei Abfragen mit <, >, = die richtigen Werte zurück bekomme #
Jahr INTEGER # INT, damit ich später bei Abfragen mit <, >, = die richtigen Werte zurück bekomme #
Viele Grüße
Werner
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Do, 21.02.2008 22:50
von Barlee
Hallo Werner,
ok, dann hatte ich Dich falsch verstanden...
Da der Feldname Teil der Abfrage (des SELECTs) ist, kannst Du ihn nicht als Variableninhalt übergeben.
Insofern hast Du Recht mit Deiner Vermutung:
SQL braucht eine klare Feldbezeichnung und nichts gebasteltes.
Gruß Barlee
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Fr, 22.02.2008 09:43
von heinz_ketchup
Hallo Barlee,
danke für Deine Hilfe! Jetzt weiß ich bescheid! Ich glaube mein Ansatz mit der Schleife ist auch zu kompliziert.
Da es ja immer nur 12 Monate sind, werde ich es mal mit einer CASE-WHEN Verzweigung probieren. Wenn ich da ins stolpern komme melde ich mich wieder.
Schöne Grüße
Werner
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Fr, 22.02.2008 22:12
von Barlee
Hallo Werner,
Du könntest doch auch Deinen Ansatz mit Schleife um ein CASE WHEN erweitern, ungefähr so:
Code: Alles auswählen
WHILE monat < 13 DO
case monat
when 1 then
INSERT INTO saldenliste ( sl_ktonr, sl_monatssaldo, sl_monat, sl_jahr)
SELECT saldenliste_original.Konto,
Saldo_1,
monat,
jahr
FROM saldenliste_original;
when 2 then
INSERT INTO saldenliste ( sl_ktonr, sl_monatssaldo, sl_monat, sl_jahr)
SELECT saldenliste_original.Konto,
Saldo_2,
monat,
jahr
FROM saldenliste_original;
when 3 then
..... usw. für Saldo_4 bis Saldo_12
else --sollte nie durchlaufen werden
INSERT INTO saldenliste ( sl_ktonr, sl_monatssaldo, sl_monat, sl_jahr)
SELECT saldenliste_original.Konto,
'0',
monat,
jahr
FROM saldenliste_original;
end case;
Vielleicht ja auch ein Weg. Führt auf jeden Fall zu dem von Dir gewünschten Ergebnis.
Schönes Wochenende!
Gruß Barlee
Re: SQL Variablen mit verschiedenen Datentypen verknüpfen
Verfasst: Sa, 23.02.2008 13:55
von heinz_ketchup
Super Barlee!
An so etwas dachte ich. Ich werde Deinen Ansatz auf jedenfall ausprobieren.
Leider dauert das ein bischen, weil andere Aufgaben (die nicht unbedingt soviel Spaß machen) eine höhere Prio haben.
Ich werde Dich auf dem Laufenden halten.
Viele Grüße
Werner