Anfänger braucht Hilfe bei einem SQL Statement

Heiko

Benutzer
Beiträge
12
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.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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.


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.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Hallo Forum,



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.

Tabelle2: Projektnummer, termin1, Termin2, etc

vielen Dank für die Hilfe.

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

Datenbank-Guru
Beiträge
4.394
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.
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
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
 
Oben