[GastForen Programmierung/Entwicklung PHP und MySQL Projektlaufzeiten

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Projektlaufzeiten

Tömsken
Beiträge gesamt: 720

14. Jan 2005, 03:31
Beitrag # 1 von 7
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe SQL-Spezialisten,

ich scheitere momentan an folgendem Problem:

Es gibt eine Tabelle "projekte" mit den Datenfeldern
"start" und "ende" vom Typ "Date".

In diesen Datenfeldern werden die Eckdaten von Projekten gespeichert, z. B. Projektstart am 03.04.2004 und Projektende am 21.01.2005.

Nun möchte ich ermitteln, wieviele Projekte in jedem Monat eines Jahres laufen. Falls es nur einen Eintrag gäbe - s. oben - sähe das Ergebnis für 2004 so aus:

Jan: 0
Feb: 0
Mär: 1
Apr: 1
Mai: 1
Jun: 1
[..]
Dez: 1

Hier ein fruchtloser Versuch:

SELECT
DATE_FORMAT(date_start, '%Y') AS y,
DATE_FORMAT(date_start, '%m') AS m,
COUNT('date_start') AS num
FROM
projects

WHERE
DATE_FORMAT(date_start, '%Y') = 2004
OR DATE_FORMAT(date_end, '%Y') = 2004
OR ( (date_start<'2004-01-01') AND (date_end>'2004-12-31') )

GROUP BY y
ORDER BY m ASC


Any Tips?
Tom
X

Projektlaufzeiten

oesi50
  
Beiträge gesamt: 2315

14. Jan 2005, 13:21
Beitrag # 2 von 7
Beitrag ID: #136367
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo tömsken,

hast Du es schon mal mit BETWEEN, COUNT und GROUP BY versucht?


Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)


als Antwort auf: [#136246]
(Dieser Beitrag wurde von oesi50 am 14. Jan 2005, 13:22 geändert)

Projektlaufzeiten

Tömsken
Beiträge gesamt: 720

14. Jan 2005, 20:29
Beitrag # 3 von 7
Beitrag ID: #136505
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Tja, nur wie?
Der "WHERE"-Abschnitt (s. o.) ist Ok, aber mit "COUNT('date_start') AS num" und "GROUP BY m" komm' ich nicht weiter.

Man könnte - das wäre vielleicht einfacher - 12 Einzelabfragen machen, eine pro Monat, und die jeweils gefundenen Datensätze addieren. Aber dazu hab' ich auch noch keine Lösung.


als Antwort auf: [#136246]

Projektlaufzeiten

Tömsken
Beiträge gesamt: 720

14. Jan 2005, 20:52
Beitrag # 4 von 7
Beitrag ID: #136510
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Korrektur: Ja, doch, 'ne Einzelabfrage z. B. für August/04 ginge so:

SELECT
COUNT('jobno') AS num
FROM
projects
WHERE
DATE_FORMAT(start, '%Y-%m') <= '2004-08' AND
DATE_FORMAT(end, '%Y-%m') >= '2004-08'
GROUP BY
jobno

Aber das muss doch einfacher gehen, also ohne 12 Einzelabfragen...


als Antwort auf: [#136246]

Projektlaufzeiten

oesi50
  
Beiträge gesamt: 2315

14. Jan 2005, 22:20
Beitrag # 5 von 7
Beitrag ID: #136522
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ne Einzelabfrage für August geht so:

SELECT count( * )
FROM test
WHERE 8 BETWEEN MONTH( date_start ) AND MONTH( date_end )

Bei deiner Datenstruktur kannst du nur 12 Joins oder subselects in eine Abfrage packen.

Eine zweite Möglichkeit wäre, 12 Spalten in denen der jeweilige Monatswert berechnet wird zu erzeugen.


Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)


als Antwort auf: [#136246]

Projektlaufzeiten

oesi50
  
Beiträge gesamt: 2315

14. Jan 2005, 22:44
Beitrag # 6 von 7
Beitrag ID: #136532
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das ist ein Beispiel für die zweite Möglichkeit(ohne Join oder Subselect).

Das Endergebnis steht dann in der letzten Ergebniszeile.


SET @m1:=0,@m2:=0,@m3:=0,@m4:=0,@m5:=0,@m6:=0,@m7:=0,@m8:=0,@m9:=0,@m10:=0,@m11:=0,@m12:=0;
SELECT *,
IF(1 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m1:=@m1+1,@m1) AS Jan,
IF(2 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m2:=@m2+1,@m2) AS Feb,
IF(3 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m3:=@m3+1,@m3) AS Mar,
IF(4 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m4:=@m4+1,@m4) AS Apr,
IF(5 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m5:=@m5+1,@m5) AS Mai,
IF(6 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m6:=@m6+1,@m6) AS Jun,
IF(7 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m7:=@m7+1,@m7) AS Jul,
IF(8 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m8:=@m8+1,@m8) AS Aug,
IF(9 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m9:=@m9+1,@m9) AS Sep,
IF(10 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m10:=@m10+1,@m10) AS Okt,
IF(11 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m11:=@m11+1,@m11) AS Nov,
IF(12 BETWEEN MONTH( date_start ) AND MONTH( date_end ),@m12:=@m12+1,@m12)AS Dez
FROM test
ORDER BY date_start,date_end;

Das Jahr kannst Du ja noch mit WHERE dranhängen.

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)


als Antwort auf: [#136246]
(Dieser Beitrag wurde von oesi50 am 14. Jan 2005, 22:52 geändert)

Projektlaufzeiten

Tömsken
Beiträge gesamt: 720

14. Jan 2005, 23:21
Beitrag # 7 von 7
Beitrag ID: #136535
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich lass nun doch 12 Einzelabfragen durchlaufen und nutze den Overhead, um die Projekte noch namentlich zu ermitteln.

Dank Dir!

[edit]

Ups, hab' gerade erst Deine 2. Lösung gesehen. DIE muss ich doch gleich noch mal ausprobieren...


als Antwort auf: [#136246]
(Dieser Beitrag wurde von Tömsken am 14. Jan 2005, 23:22 geändert)
X