Hallo liebe Helfenden,
ich versuche mal mein Problem zu schildern. Ich habe eine Ausgangstabelle, in der sind Kundennummer (Kd_Nr), gekauftes Erzeugnis (EGRP), Jahr und der Umsatz mit dem jeweiligen Erzeugnis in jedem Monat (Umsatz01, Umsatz02, ... Umsatz12) aufgeführt.
Jetzt möchte ich diese Tabelle "auflösen", so dass ich nur noch Kd_Nr, EGRP, Jahr, Monat und Umsatz habe. Also aus den 12 Monatsfeldern nur noch ein Monatsfeld machen und die Informationen in einzelne Datensätze pro Monat aufspalten.
Ich habe die Ausgangstabelle und das gewünschte Ziel in einem Beispiel angehängt:
Ich habe versucht das Problem über eine Stored Procedure mit einer While-Schleife zu lösen, scheitere aber am Hochzählen der Feldnamen, weil es nicht möglich ist diese "zusammenzusetzen".
Vielleicht fällt euch ja etwas dazu ein. Und wenn es auch nur ein "GEHT NICHT" ist, dann weiß ich wenigstens dass ich mir damit nicht mehr den Kopf zerbrechen muß.
Vielen Dank und schöne Grüße
Werner
Tabelle drehen - geht das in MySQL?
Moderator: Moderatoren
-
- ****
- Beiträge: 111
- Registriert: So, 07.10.2007 16:05
- Wohnort: München
Tabelle drehen - geht das in MySQL?
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
Re: Tabelle drehen - geht das in MySQL?
Hallo Werner,
Gruß Barlee
Ich kann es gerade nicht testen, aber vielleicht kannst Du die Spaltennamen vorher durch die Ziffern 1 bis 12 ersetzen?Ich habe versucht das Problem über eine Stored Procedure mit einer While-Schleife zu lösen, scheitere aber am Hochzählen der Feldnamen, weil es nicht möglich ist diese "zusammenzusetzen".
Gruß Barlee
Re: Tabelle drehen - geht das in MySQL?
Hallo Werner,
ich hätte versucht das Problem mit INSERT ... SELECT zu lösen. Z.Bsp. so:
Ich habe diese Variante mit erfolg getestet. Man muss nur diese Anweisung 12 Mal abgeben und dabei jedes Mal den Monat ...'1' AS Monat... und die Spalte der alten Tabelle ...Umsatz01... entsprechend ändern. So sieht es z.B. für Februar aus: Zu beachten ist aber die Anweisung NUR einmal abzusenden! Ansonsten hat man doppelte Datensätze...
Eine andere Idee habe ich im Moment noch nicht.
ich hätte versucht das Problem mit INSERT ... SELECT zu lösen. Z.Bsp. so:
Code: Alles auswählen
INSERT <tbl_neu> (Kd_Nr, EGRP, Jahr, Monat, Umstz)
SELECT Kd_Nr, EGRP, Jahr, '1' AS Monat, Umsatz01 AS Umsatz FROM <tbl_alt>;
Code: Alles auswählen
INSERT <tbl_neu> (Kd_Nr, EGRP, Jahr, Monat, Umstz)
SELECT Kd_Nr, EGRP, Jahr, '2' AS Monat, Umsatz02 AS Umsatz FROM <tbl_alt>;

Eine andere Idee habe ich im Moment noch nicht.
Habe keine Angst vom Unbekannten. Denke daran - Titanic haben Profis gebaut, die Arche ein Amateur!
-
- ****
- Beiträge: 111
- Registriert: So, 07.10.2007 16:05
- Wohnort: München
Re: Tabelle drehen - geht das in MySQL?
Hallo Barlee, hallo Mr. bobo,
die Idee, einfach für die Spaltenbezeichnungen die Werte 1, 2 ... 12 zu wählen fand ich ganz elegant. Leider klappt das nicht wirklich. Es wird nicht der Spalteninhalt von 1 eingefügt, sonder der Wert meiner Variablen (also 1 bis 12).
Hier mal meine Prozedur:
1. Gibt es eine Möglichkeit MySQL zu sagen, dass es explizit das Feld 'feld' und nicht den Inhalt der Variablen nehmen muss? (außerdem funktioniert meine Schleife noch nicht richtig. Es werden Unmengen von Daten produziert. Vielleicht entdeckt ja jemand den Fehler)
2. parallel zur WHILE-Schleife, würde ich gerne den Ansatz von Mr. bobo aufgreifen. Gibt es eine Möglichkeit, die 12 INSERT-Anweisungen hintereinander zu hängen, so dass mit einer Ausführung die Daten konvertiert sind?
Danke für's Kopfzerbrechen und schöne Grüße
Werner
die Idee, einfach für die Spaltenbezeichnungen die Werte 1, 2 ... 12 zu wählen fand ich ganz elegant. Leider klappt das nicht wirklich. Es wird nicht der Spalteninhalt von 1 eingefügt, sonder der Wert meiner Variablen (also 1 bis 12).
Hier mal meine Prozedur:
Code: Alles auswählen
BEGIN
DECLARE monat INT;
DECLARE feld INT;
SET monat = 11;
SET feld = 1;
WHILE monat < 13 DO
INSERT INTO cselling_test(cs_kdnr, cs_branche, cs_abc1, cs_abc2, cs_kdbez, cs_egrp, cs_umsatz, cs_monat, cs_jahr)
SELECT Kundennummer,
Branche,
Abc_Kz1,
Abc_Kz2,
Name_1,
EGRP,
feld,
monat,
Jahr
FROM cselling_original;
SET feld = feld + 1;
SET monat = monat + 1;
END WHILE;
END
2. parallel zur WHILE-Schleife, würde ich gerne den Ansatz von Mr. bobo aufgreifen. Gibt es eine Möglichkeit, die 12 INSERT-Anweisungen hintereinander zu hängen, so dass mit einer Ausführung die Daten konvertiert sind?
Danke für's Kopfzerbrechen und schöne Grüße
Werner
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
Re: Tabelle drehen - geht das in MySQL?
Hallo Werner,
Gruß Barlee
Nur einmal auf die Schnelle: Setze den Spaltenbezeichner Feld einmal in Anführungszeichen und probiere erneut. Ändert sich etwas? Testen kann ich's leider immer noch nicht...Gibt es eine Möglichkeit MySQL zu sagen, dass es explizit das Feld 'feld' und nicht den Inhalt der Variablen nehmen muss?
Gruß Barlee
-
- ****
- Beiträge: 111
- Registriert: So, 07.10.2007 16:05
- Wohnort: München
Re: Tabelle drehen - geht das in MySQL?
Hallo Barlee, hallo Mr. bobo,
vielen Dank für eure Hilfe. Ihr habt mir mit eueren Anregungen den Weg zu einer Lösung geführt.
Hier das Ergebnis:
Schöne Grüße
Werner
vielen Dank für eure Hilfe. Ihr habt mir mit eueren Anregungen den Weg zu einer Lösung geführt.
Hier das Ergebnis:
Code: Alles auswählen
INSERT INTO cselling_test(cs_kdnr, cs_branche, cs_abc1, cs_abc2, cs_kdbez, cs_egrp, cs_umsatz, cs_monat, cs_jahr)
SELECT * FROM
(
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz01, 1, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz02, 2, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz03, 3, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz04, 4, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz05, 5, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz06, 6, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz07, 7, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz08, 8, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz09, 9, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz10, 10, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz11, 11, Jahr FROM cselling_original
UNION ALL
SELECT Kundennummer, Branche, Abc_Kz1, Abc_Kz2, Name_1, EGRP, Umsatz12, 12, Jahr FROM cselling_original
) AS t1 ORDER BY Jahr;
Werner
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5