hilfdirselbst.ch
Facebook Twitter gamper-media
Tömsken
Beiträge: 720
14. Jan 2005, 03:31
Beitrag #1 von 7
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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 Top
 
X
oesi50  A  S
Beiträge: 2315
14. Jan 2005, 13:21
Beitrag #2 von 7
Beitrag ID: #136367
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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)
Top
 
Tömsken
Beiträge: 720
14. Jan 2005, 20:29
Beitrag #3 von 7
Beitrag ID: #136505
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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] Top
 
Tömsken
Beiträge: 720
14. Jan 2005, 20:52
Beitrag #4 von 7
Beitrag ID: #136510
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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] Top
 
oesi50  A  S
Beiträge: 2315
14. Jan 2005, 22:20
Beitrag #5 von 7
Beitrag ID: #136522
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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] Top
 
oesi50  A  S
Beiträge: 2315
14. Jan 2005, 22:44
Beitrag #6 von 7
Beitrag ID: #136532
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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)
Top
 
Tömsken
Beiträge: 720
14. Jan 2005, 23:21
Beitrag #7 von 7
Beitrag ID: #136535
Bewertung:
(1372 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Projektlaufzeiten


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)
Top
 
X