Spalten vermischen

Stephan

Neuer Benutzer
Beiträge
3
Hallo Leute,

mit UNION kann man ja mehrer SELECTs zusammenführen.

Dies stellt ja, graphisch gesehen, eine Vermengung in senkrechter Ebene dar. (gleiche Feldanzahl und Datentypen vorausgesetzt)
Ich brauche eine Vermengung in waagerechter Ebene.

Nun habe ich eine folgende Abfrage (Pseudo-SQL)

SELECT * FROM rechnung r LEFT JOIN bezahlung b LEFT JOIN gutschrift g

Also auf der linken Seite alle Rechnungen und auf der rechten Seite wie die Rechnung 'bezahlt' wurde. Wenn nun eine Rechnung BEZAHLT wurde sind die Spalten von gutschrift NULL und umgekehrt.
Gibt es eine Möglichkeit die rechte Seite der Abfrage zu vereinen?
Also, dass ich am Ende nur meine Rechungsdaten habe und rechts die Datenfelder zur Bezahlung/Verrechnung.

Ich hoffe meine Frage ist verständlich :)
Habt schonmal vielen Dank.

MFG Stephan
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.851
Hy,

kannst du bitte deine Sourcetabelle beschreiben + die gewünschte Ausgabe in tabellarischer Form!?

Danke und Lg

Vermutlich so:

Code:
test=*# select * from rechnung ;
 id | betrag
----+--------
  1 |     10
  2 |     20
(2 rows)

Time: 0,264 ms
test=*# select * from bezahlung ;
 rechnung | betrag
----------+--------
        1 |     10
(1 row)

Time: 0,358 ms
test=*# select * from gutschrift ;
 rechnung | betrag
----------+--------
        2 |     20
(1 row)

Time: 0,179 ms
test=*# select r.betrag, b.betrag, g.betrag from rechnung r left join bezahlung b on (r.id=b.rechnung) left join gutschrift g on (r.id=g.rechnung);
 betrag | betrag | betrag
--------+--------+--------
     20 |        |     20
     10 |     10 |
(2 rows)

(hätte wohl noch die id anzeigen sollen ... )

Problem an der Sache ist, daß es so passieren kann, daß es sowohl bezahl als auch gutschrift gibt. Es wäre vielleicht sinnvoller, bezahlt und gutschrift in EINE Tabelle zu packen und eine extra Flag zu setzen, was es ist. Aber es gibt noch ein Problem: Teilrechnungen. Und Teil-Gutschriften.

Aber hier mag sich erst einmal der Fragesteller positionieren.

Code:
test=# select 'kaffee' as todo into me;
WARNING:  column "todo" has type "unknown"
DETAIL:  Proceeding with relation creation anyway.
SELECT 1
Time: 4,099 ms
test=*# \d me
      Table "public.me"
 Column |  Type   | Modifiers
--------+---------+-----------
 todo   | unknown |

test=*# select * from me;
  todo
--------
 kaffee
(1 row)

LOL


Andreas
 

Stephan

Neuer Benutzer
Beiträge
3
das ist ein Ausschnit aus meine View.
Die ersten 4 Spalten kommen aus der Rechung
Bezahl-Konto und Bezahlbetrag sind Buchungen zur Ausgangszahlung (brauche ich für Skontozahlungen)
Ausgangsbeleg und -betrag + Bezahldatum kommt aus bezahlung
un dzu guter letzt die Gutschrift mit Nummer, Betrag und Datum.

"Problem an der Sache ist, daß es so passieren kann, daß es sowohl bezahl als auch gutschrift gibt. Es wäre vielleicht sinnvoller, bezahlt und gutschrift in EINE Tabelle zu packen und eine extra Flag zu setzen, was es ist. Aber es gibt noch ein Problem: Teilrechnungen. Und Teil-Gutschriften."

--> Wenn ich Teilrechnungen habe, kommt dies als gesonderte Zeile heraus. Das Problem Teilgutschift bekomme ich dann durch ein Makro gelöst.

Die SQL-Abfrage wird im Anschluss nochmal in Excel überführt. Ich möchte nur den größten Teil bereits vorformatieren.
 

Anhänge

  • beispiel.txt
    286 Bytes · Aufrufe: 3

akretschmer

Datenbank-Guru
Beiträge
9.851
das ist ein Ausschnit aus meine View.
Die ersten 4 Spalten kommen aus der Rechung
Bezahl-Konto und Bezahlbetrag sind Buchungen zur Ausgangszahlung (brauche ich für Skontozahlungen)
Ausgangsbeleg und -betrag + Bezahldatum kommt aus bezahlung
un dzu guter letzt die Gutschrift mit Nummer, Betrag und Datum.

"Problem an der Sache ist, daß es so passieren kann, daß es sowohl bezahl als auch gutschrift gibt. Es wäre vielleicht sinnvoller, bezahlt und gutschrift in EINE Tabelle zu packen und eine extra Flag zu setzen, was es ist. Aber es gibt noch ein Problem: Teilrechnungen. Und Teil-Gutschriften."

--> Wenn ich Teilrechnungen habe, kommt dies als gesonderte Zeile heraus. Das Problem Teilgutschift bekomme ich dann durch ein Makro gelöst.

Die SQL-Abfrage wird im Anschluss nochmal in Excel überführt. Ich möchte nur den größten Teil bereits vorformatieren.


Okay. Was war nun die Frage?

Aus dem ersten Posting:

Gibt es eine Möglichkeit die rechte Seite der Abfrage zu vereinen?
Also, dass ich am Ende nur meine Rechungsdaten habe und rechts die Datenfelder zur Bezahlung/Verrechnung.

Willst Du Spalten unterdrücken? Dann (und eigentlich immer) verwende statt * eine Aufzählung der gewünschten Spalten im Select.


Andreas
 

Stephan

Neuer Benutzer
Beiträge
3
Hallo Andreas,

tut mir leid wenn ich mich so ungeschickt ausgedrückt habe.
Die SQL-Anweisung ist nur bruchstückhaft, da ich euch mit einer 10-zeiligen nicht langweilen wollte, habe ich nur die wichtigsten Informationen reingepackt.


Also die View stellt ja dar, dass eine Rechnung über 3 Wege abgewickelt werden kann:

1. Journalüberweisung (Bezahl-Konto, Bezahlbetrag) -> für Zahlung mit Skonto
2. Ausgangszahlung (Ausgangsbeleg, Ausgangsbetrag, Bezahldatum) -> für normale Bezahlung
3. Gutschrift (Gutschriftnr., Gutschriftbetrag, Gutschriftdatum) -> für Verrechung mit Gutschrift

All diese Spalten erscheinen nebeneinander (auch ganz normal, da sie aus verschiedenen Tabellen kommen)

Meine View soll aber so aussehen.

Rechnungsnr. | RE-Betrag | Ausgangsbeleg | Ausgangsbetrag | Bezahldatum
20120008 63,89 1200 62,61
20120009 418,09 20120058 418,09 16.01.2012
20120010 233 20120001 233 09.01.2012

Also soll die Tabelle ALLE Daten aus der ursprünglichen View enthalten aber dies in 5 Spalten und nicht wie zuvor in 10.

Die Spalten rechts von RE-Betrag sollen sich quasi auf das Mindestmaß vereinen OHNE Informationen unter den Tisch fallen zu lassen, also der SELECT muss so umfangreich bleiben.

Ich hoffe das Problem ist ein wenig klarer geworden :)

Ich danke dir

Gruß Stephan
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.851
Also soll die Tabelle ALLE Daten aus der ursprünglichen View enthalten aber dies in 5 Spalten und nicht wie zuvor in 10.


Gruß Stephan

Definiere wie das zu erfolgen hat;

Angenommen Deine Daten (aus Deinem Post):

Code:
test=*# select * from stefan ;
    re    | re_betrag | bez_konto | bez_betrag | aus_beleg | aus_betrag |  bez_dat   |   gs_nr   | gs_betrag |  gs_datum
----------+-----------+-----------+------------+-----------+------------+------------+-----------+-----------+------------
 20120008 |     63.89 | 1200      |      62.61 |           |            |            |           |           |
 20120009 |    418.09 | 1200      |     418.09 | 20120058  |     418.09 | 2012-02-16 |           |           |
 20120010 |       233 |           |            |           |            |            | 201200001 |       233 | 2012-09-01
(3 rows)

Erster Versuch:

Code:
test=*# select re, re_betrag, coalesce(bez_konto, aus_beleg, gs_nr) from stefan ;
    re    | re_betrag | coalesce
----------+-----------+-----------
 20120008 |     63.89 | 1200
 20120009 |    418.09 | 1200
 20120010 |       233 | 201200001

Scheitert schon mal, weil in Zeile 2 mehr Felder ausgefüllt sind als in Zeile 1 und 3. Man könnte hier raten und spekulieren, was Du da genau willst...

Andreas
 
Oben