Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalten vermischen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Stephan, 21 Februar 2013.

  1. Stephan

    Stephan Neuer Benutzer

    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
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

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

    Danke und Lg
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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
     
  4. Stephan

    Stephan Neuer Benutzer

    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:

  5. akretschmer

    akretschmer Datenbank-Guru


    Okay. Was war nun die Frage?

    Aus dem ersten Posting:

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


    Andreas
     
    PLSQL_SQL gefällt das.
  6. Stephan

    Stephan Neuer Benutzer

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden