maik87
Goto Top

MySQL - Datensätze in Abfrage duplizieren

Hallo zusammen,

ich habe in MySQL eine Tabelle:

Spalte A:
1
2
3
4
5
...


Nun kann ich diese wie folgt abfragen:
"SELECT A FROM..."

Wie bekomme ich es aber nun hin, dass ich folgende Ausgabe habe:

1,A
1,B
2,A
2,B
3,A
3,B
...

Ich möchte also jeden Datensatz nochmal duplizieren und jeweils eine Spalte mit dem Wert "A" oder "B" anhängen.

Wie sieht hierfür die Abfrage aus?

Content-Key: 195347

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

Printed on: April 23, 2024 at 08:04 o'clock

Member: Biber
Biber Dec 04, 2012, updated at Dec 30, 2012 at 14:40:40 (UTC)
Goto Top
Moin Maik87,

wozu auch immer das gut sein soll...

SELECT spalteA, 'A' as whatever FROM dyTable  
UNION ALL
SELECT spalteA, 'B' as whatever FROM dyTable  
order by 1, 2

Grüße
Biber
Member: Maik87
Maik87 Dec 30, 2012 at 00:13:05 (UTC)
Goto Top
Danke Biber!
Anders gehts aber nicht, oder? Also ohne dass ich die Query zwei mal auführen muss.
Member: Biber
Biber Dec 30, 2012 at 14:52:13 (UTC)
Goto Top
Moin Maik87,

mit SQL geht es immer auch anders... face-wink

du kannst dir auch eine Tabelle "whatever" anlegen mit einem Char(1)-Textfeld namens SpalteB, zwei Datensätze mit dem Inhalt "A" und "B" anlegen und dann ein Statement wie folgt formulieren:
SELECT dytable.SpalteA, whatever.SpalteB
FROM dytable, whatever
ORDER by 1, 2

Nichtsdestotrotz - eigentlich werden erst mit SQL-Statements Daten durchflöht und dann kommt ein mehr oder weniger erwartetes Resultset zurück.

Der Ansatz "Ich habe ein feststehendes Endergebnis und bau mir die entsprechenden Quelldaten entsprechend" ist zumindest in den alten SQL-Spezifikationen meiner Jugend noch nicht so explizit ausformuliert.

Was ist denn die konkrete Aufgabenstellung, die hinter deiner Frage steht?

Grüße
Biber
Member: Maik87
Maik87 Jan 30, 2013 at 11:34:26 (UTC)
Goto Top
Hallo Biber,

sorry, dass ich mich erst jetzt melde.

Danke für den Code - klappt face-smile

Die Aufgabe sieht wie folgt aus:
Ich habe eine Tabelle, mit den Spalten "Abteilung", "Geschlecht" und "Anzahl".

Die gibt zum Beispiel folgendes aus:
EDV m 10
Einkauf w 1
Einkauf m 2

Jetzt wollte ich die Tabelle so aufbrechen, dass ich bei EDV auch eine Zeile für "w" bekomme, auch wenn hier keine Daten drin sind. Nur, damit es leichter zu lesen ist. Auf der anderen Seite baue ich mit PHP eine Pflegeseite auf, bei der "EDV" und "w" auch ankommen soll, damit dort überhaupt eine Anzahl eingepflegt werden kann.

Ich hoffe, du verstehst was ich meine face-smile
Member: LianenSchwinger
LianenSchwinger Jan 30, 2013 updated at 15:08:56 (UTC)
Goto Top
Ohne UNION ALL kommst Du hier nicht weiter.

SELECT x.abteilung AS Abteilung,
       'm' AS Geschlecht,  
       IFNULL(y.anzahl,0) AS Anzahl
FROM (SELECT DISTINCT a.abteilung FROM xy_tabelle AS a) AS x
LEFT JOIN (SELECT a.* FROM xy_tabelle AS a WHERE a.geschlecht = 'm') AS y USING(abteilung)  

UNION ALL

SELECT x.abteilung AS Abteilung,
       'w' AS Geschlecht,  
       IFNULL(y.anzahl,0) AS Anzahl
FROM (SELECT DISTINCT a.abteilung FROM xy_tabelle AS a) AS x
LEFT JOIN (SELECT a.* FROM xy_tabelle AS a WHERE a.geschlecht = 'w') AS y USING(abteilung)  

Zwar andere Baustelle, aber warum speicherst Du nicht Anzahl m und Anzahl w in einer Zeile.

Abteilung Anz_M Anz_W
EDV          10     0
EINKAUF       2     1


Alles eine Frage des Tabellenaufbaus.

Kommt das Ergebnis Deiner Tabelle nicht schon aus einer anderen Abfrage über die Mitarbeiter einer Abteilung?

Gruß Jörg
Member: Maik87
Maik87 Jan 31, 2013 at 09:17:45 (UTC)
Goto Top
Moin,

also ich habe es mit einer weiteren Tabelle "SplittingValues" gelöst - wie in Bibers letztem Beispiel.

Läuft prima so!

Nee, die Daten kommen nicht aus einer anderen Tabelle. Sie kommen so aufbereitet aus SAP.
Anzahl w und m geht nicht in eine Zeile, so noch mehr Informationen in der Zeile stehen. So werden beispielsweise noch Daten wie Gesundheitsstand, davon Teilzeitkräfte etc. je "Abteilung-Geschlecht"-Zeile gespeichert.
Member: Biber
Biber Feb 01, 2013 at 03:01:03 (UTC)
Goto Top
[OT]
Zitat von @Maik87:
Moin,

also ich habe es mit einer weiteren Tabelle "SplittingValues" gelöst - wie in Bibers letztem Beispiel.
Hmmja, wenn ich diese Dummytabelle für die m/w-Info sprechend zu benennen gehabt hätte, dann würde sie wohl "AlwaysSex" heissen...

Aber "SplittingValues" ist immerhin sprechender als "whatever".

Grüße
Biber
[/OT]
Member: Maik87
Maik87 Feb 01, 2013 updated at 07:53:45 (UTC)
Goto Top
face-big-smile

Ich habe die Tabelle noch mit anderen SplittingValues für andere Abfragen gefüllt.

SELECT dytable.SpalteA, SplittingValues.SpalteB 
FROM dytable, SplittingValues 
WHERE SplittingValues.SpalteB IN ('w','m')  
ORDER by 1, 2


So kann ich das Ding dynamisch überall einsetzen face-smile


Edit:
Fehler im Code behoben.
Member: LianenSchwinger
LianenSchwinger Feb 01, 2013 at 07:28:10 (UTC)
Goto Top
... Du meinst wohl

WHERE SplittingValues.SpalteB IN ('w','m')  

G Jörg
Member: Maik87
Maik87 Feb 01, 2013 at 07:53:13 (UTC)
Goto Top
Sorry - natürlich mein ich das.