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

Ausgabe in ein Eintrag

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Hoppel, 19 Februar 2016.

  1. Hoppel

    Hoppel Aktiver Benutzer

    Hallo Leute,

    folgendes SQL-Statement:

    Code:
    SELECT p.lastName,
        IF((dayname(b.date)='Monday'), 'x', '') as Montag,
        IF((dayname(b.date)='Tuesday'), 'x', '') as Dienstag,
        IF((dayname(b.date)='Wednesday'), 'x', '') as Mittwoch,
        IF((dayname(b.date)='Thursday'), 'x', '') as Donnerstag,
        IF((dayname(b.date)='Friday'), 'x', '') as Freitag
    FROM booking b, booked bk, person p
    WHERE YEARWEEK(b.date,7)=YEARWEEK('2017-02-14') and b.bookingID = bk.bookingID and bk.PersonID = p.PersonID
    liefert mir folgende Ausgabe:

    Code:
    Nachname Montag Dienstag Mittwoch Donnerstag Freitag
    Mustermann    x
    Mustermann           x
    Mustermann                  x
    Soweit so gut, jetzt möchte ich aber, dass für jeden Name nur eine Zeile ausgegeben wird. Also folgendes:

    Code:
    Nachname Montag Dienstag Mittwoch Donnerstag Freitag
    Mustermann   x        x        x
                                                                           
    Ist das mit SQL soweit möglich und wenn ja wie?

    Vielen Dank schon mal im Voraus und ich freue mich auf Eure Vorschläge/Anregungen!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja, geht. Einfach noch mal aggregieren.

    Code:
    test=*# with bla as (select 'max' as name, 'x' as montag, '' as dienstag, '' as mittwoch union all select 'max','','x','' union all select 'max', '','','x') select * from bla; name | montag | dienstag | mittwoch
    ------+--------+----------+----------
     max  | x  |  |
     max  |  | x  |
     max  |  |  | x
    (3 rows)
    
    test=*# with bla as (select 'max' as name, 'x' as montag, '' as dienstag, '' as mittwoch union all select 'max','','x','' union all select 'max', '','','x') select name, array_to_string(array_agg(montag),''), array_to_string(array_agg(dienstag),''), array_to_string(array_agg(mittwoch),'') from bla group by name;
     name | array_to_string | array_to_string | array_to_string
    ------+-----------------+-----------------+-----------------
     max  | x  | x  | x
    (1 row)
    
    Das wäre die Lösung in PostgreSQL.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    in mysql nennt sich die Funktion wohl group_concat() ;-)
     
  4. Hoppel

    Hoppel Aktiver Benutzer

    Vielen Dank für den Hinweis:

    Code:
    SELECT p.lastName, GROUP_CONCAT(IF((dayname(b.date)='Monday'), 'x', '')) as Montag,
                        GROUP_CONCAT(IF((dayname(b.date)='Tuesday'), 'x', '')) as Dienstag,
                        GROUP_CONCAT(IF((dayname(b.date)='Wednesday'), 'x', '')) as Mittwoch,
                        GROUP_CONCAT(IF((dayname(b.date)='Thursday'), 'x', '')) as Donnerstag,
                        GROUP_CONCAT(IF((dayname(b.date)='Friday'), 'x', '')) as Freitag
    from booking b, booked bk, person p
    WHERE YEARWEEK(b.date,7)=YEARWEEK('2017-02-13') and b.bookingID = bk.bookingID and bk.PersonID = p.PersonID
    group by p.lastname
    Das funktioniert soweit auch prima, aber einen kleinen Schönheitsfehler hat das ganze. So sieht die Ausgabe aus:
    Code:
                 Mo        Di       Mi       Do
    Mustermann    ,x,,    ,,,x   ,x,,    x,,,
     
    akretschmer gefällt das.
  5. akretschmer

    akretschmer Datenbank-Guru

    bei mir nicht ;-)
     
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