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

Anfänger braucht Hilfe bei einem SQL Statement

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Heiko, 10 Mai 2013.

  1. Heiko

    Heiko Benutzer

    Hallo Forum,

    ich stehe vor dem Problem, dass ich eine Abfrage erstellen soll und nicht weiß wie ich diese bewerkstelligen kann.

    Ich habe zwei Tabellen; in der ersten sind Projektdaten. Aus der suche ich mir alle Projekte eines bestimmten Projekttypes.

    In der zweiten Tabelle sind Beginn- und Enddaten (Termine) und zwar insgesamt bis zu sechs. Nur sind die Termine dort nicht schön als ein Datensatz je Projekt angelegt, sondern für jeden dieser Termine ist ein Datensatz in Tabelle 2.

    Wie bekomme ich nun eine Abfrage, in der ich die Daten der ersten Tabelle plus die bis zu sechs Daten aus der zweiten Tabelle als einen Datensatz darstellen kann.

    Tabelle1: Projektnummer, Projekttyp, Text ....

    Tabelle2: Projektnummer, termin1, Termin2, etc

    vielen Dank für die Hilfe.
     
  2. akretschmer

    akretschmer Datenbank-Guru


    So vielleicht?

    Code:
    test=*# select * from projekte ;
     id |   name
    ----+----------
      1 | projekt1
      2 | projekt2
    (2 rows)
    
    Time: 0,179 ms
    test=*#
    test=*#
    test=*#
    test=*# select * from termine;
     p_id |     s      |     e
    ------+------------+------------
        1 | 2013-01-01 | 2013-01-10
        1 | 2013-02-02 | 2013-02-12
        1 | 2013-03-03 | 2013-03-13
        1 | 2013-04-03 | 2013-04-13
        1 | 2013-05-03 | 2013-05-13
    (5 rows)
    
    Time: 0,196 ms
    test=*# select p.name, array_to_string(array_agg(t.s::text || ' bis ' || t.e::text),',') from projekte p left join termine t on p.id=t.p_id group by p.name;
       name   |                                                          array_to_string
    ----------+-----------------------------------------------------------------------------------------------------------------------------------
     projekt1 | 2013-01-01 bis 2013-01-10,2013-02-02 bis 2013-02-12,2013-03-03 bis 2013-03-13,2013-04-03 bis 2013-04-13,2013-05-03 bis 2013-05-13
     projekt2 |
    (2 rows)
    
    
    PostgreSQL, wirst Du evtl. für M$SQL anpasen müssen.
     
  3. ukulele

    ukulele Datenbank-Guru

    Zu array_to_string gibt es meines Wissens nach kein Equivalent in MSSQL.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Wie ich DICH kenne machst Du das ganz einfach in einer SP ;-)
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Mal der Vollständigkeit halber noch ein anderer Weg:

    Code:
    test=*# select * from termine;
     p_id |     s      |     e
    ------+------------+------------
        1 | 2013-01-01 | 2013-01-10
        1 | 2013-02-02 | 2013-02-12
        1 | 2013-03-03 | 2013-03-13
        1 | 2013-04-03 | 2013-04-13
        1 | 2013-05-03 | 2013-05-13
        2 | 2013-05-03 | 2013-05-13
        2 | 2013-06-03 | 2013-06-13
    (7 rows)
    
    Time: 0,215 ms
    test=*# select p_id, max(case when r = 1 then s else null end) as termin1, max(case when r=2 then s else null end) as termin2 from(select p_id, s, e, row_number() over (partition by p_id order by s) as r from termine) foo group by p_id;
     p_id |  termin1   |  termin2
    ------+------------+------------
        1 | 2013-01-01 | 2013-02-02
        2 | 2013-05-03 | 2013-06-03
    (2 rows)
    
    Unvollständig, da ich nur die Start-Termine und auch nur 2 anzeige, für den Rest bin ich grad zu faul.

    Achtung: das skaliert nicht, wenn Du die Anzahl der möglichen Termine später erhöhen willst mußt Du das SQL anpassen. Könnte man zwar mit einer SP in pl/pgsql oder so auch dynamisch machen, aber generell: man sollte Datenbanken nicht als Tabellenkalkulation nutzen.
     
    ukulele gefällt das.
  6. ukulele

    ukulele Datenbank-Guru

    Das ist unter MSSQL schon ein leidiges Thema, deswegen überlasse ich das lieber dir. Bisher habe ich meist einen anderen Weg gefunden zu bekommen was ich wollte und mich davor gedrückt.
     
    akretschmer gefällt das.
  7. akretschmer

    akretschmer Datenbank-Guru

    Dann warten wir mal ab, was der Fragesteller dazu sagt, ...
     
  8. Tommi

    Tommi Datenbank-Guru

    Hi,

    für einen Anfänger hab ich hier mal genau das Richtige ;) .
    Da der SQL-Server ja mit Arrays nicht kann, hab ich mal eine Lösung mittels PIVOT-Funktion erstellt:

    Code:
    SELECT Projektnummer, Projekttyp, Text,
    [1] as Termin1,
    [2] as Termin2,
    [3] as Termin3,
    [4] as Termin4,
    [5] as Termin5,
    [6] as Termin6
    FROM
    (SELECT Projektnummer, Projekttyp, Text, Termin, LFD
        FROM
    (SELECT A.Projektnummer, A.Projekttyp, A.Text, B.Termin ,
    ROW_NUMBER() OVER (PARTITION BY A.Projektnummer ORDER BY B.Termin) as LFD
    FROM Tabelle1 A
    INNER JOIN Tabelle2 B
    ON A.Projektnummer=B.Projektnummer)  A
        ) AS ST
    PIVOT
    (
    MAX(Termin)
    FOR LFD IN ([1], [2], [3], [4], [5], [6])
    ) AS PT
    Das Arbeitet ähnlich wie die CASE...WHEN...THEN Abfrage von akretschmer.

    Viele Grüße,
    Tommi
     
    ukulele und akretschmer gefällt das.
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