suche sql ausdruck fuer

jma

Mitglied
Hallo
an alle, die mal gerne nen SQL Ausdruck zusammenbasteln :)

Und zwar geht es darum, ich habe eine Tabelle, in der Datensaetze abliegen (Felder id,.., datum), nun moechte ich einfach fuer jeden Monat die Anzahl der DS ermitteln.
Der Zeitraum fuer den ich dann letzendlich die Daten brauche wird zur laufzeit festgelegt, kann also 11.2006 bis 05.2007 wie auch einfach nur 03.2007 sein.

Ich denke ich mache nen group ueber datum, und selecte dann den zeitraum per where Klausel.

ins unreine:
select xyz.* from (
select anz(id) as gefunden, Datum_format("monat.Jahr",datum) as datum2 group by Datum_format("monat.Jahr",datum)
) as xyz where xyz.datum2 >= datum_von and xyz.datum2 <=datum_bis
order by datum2;

Jetzt mein Problem, wie bekomme ich es hin, das er mir fuer Monate in denen er keinen DS findet, den Wert 0 ausgibt? Die Sache ist die, dass das ganze per Dataset in ein Diagramm wandert, und ich die Daten in der Anwendung selber nicht manipulieren moechte.

Wer kann mir da ein paar Tips geben
Danke und schoenes WE
jma
 
Hi
Wenn du für jedes Datum einen Eintrag haben willst, musst du eine Zusatztabelle erstellen mit allen Daten drin.

Dafür habe ich zwei Tabellen erstellt:
alldates:
ID - eindeutige ID
ddate - alle Daten die bei der Ausgabe eangezeigt werden sollen

mydates:
ID - eindutige ID
ddate - nur die Daten, die dann auch gezählt werden

Mit dieser Abfrage bekommst du nun genau das was du willst:
SQL:
SELECT count(distinct my.ID) FROM mydates as my
right join alldates as al on al.ddate=my.ddate
group by al.ddate
 
Hallo,
das wars leider nicht was ich meinte.

dein Audruck zählt alle DS, die im entsprechenden Zeitfenster liegen, bei Datensaetze außehalb des Zeitfenster schreibt er in anzahl eine 0 rein. Aber er beruecksichtigt keine Zeiträume zu denen es in der Tabelle keine Datensaetze gibt.

also ein Beispiel : gewuenschter Zeitraum 01.03.2007 bis 01.08.2007

Ausgabe:
datum anzahl gefundener DS
03.2007 165
04.2007 19
05.2007 349
06.2007 0 <---- fuer diesen Monat existieren keine Datensaetze
07.2007 213
08.2007 0 <---- fuer diesen Monat existieren keine Datensaetze

mir fällt grad nur ein, dass ich in der Anwendung selber per Schleife jeden Monat durchgehe, die den Sql-Ausdruck erweitere und dann nen ausdruck habe wie

Code:
select m1.anz,m2.anz,m3.anz ,.. mn.anz from 
(select count(id) as anz from tbl... where DATE_FORMAT(d_Datum,'%Y-%m') ='2007-03') as m1,
(...) as m2,
(...) as m3,
...
(select count(id) as anz from tbl... where DATE_FORMAT(d_Datum,'%Y-%m') ='2007-08') as mn;

Sehr unschoen und vorallem kann der ausdruck sehr lang, unuebersichtlich und evt. die berechnung wohl auch zeitaufwendig werden, aber was anderes fällt mir nicht ein.

Hat sonst keiner eine Idee?
jma
 
Zuletzt bearbeitet:
Ah du willst es nur über die Monate hinweg haben?

Nun, wäre es denn sehr schlimm in der Hilfstabelle 'alldates' für jeden Monat einen Datensatz zu haben? Weil dann würde es einfach und vor allem auch schnell funktionieren.

SQL:
SELECT concat(month(al.ddate), ".", year(al.ddate)), count(DISTINCT my.ID) FROM mydates AS my
RIGHT JOIN alldates AS al ON concat(month(al.ddate), ".", year(al.ddate))=concat(month(my.ddate), ".", year(my.ddate))
GROUP BY concat(month(al.ddate), ".", year(al.ddate))

Tabellen sind immer noch gleich
alldates müsste einfach für jeden Monat einen Eintrag haben.
Allternativ kannst du dir diese Tabelle auch jedesmal als tempTabelle erstellen lassen.

Sonst kannst du natürlich das ganze auch mit diesm as m1, as m2 machen, ist aber fast noch unschöner als meine Lösung.

Gruss
 
Hallo,
nunja, wenn ich sicherstellen koennte, dass es zu jedem Monat einen Datensatz gibt koennte ich problemlos deinen oder auch alternative Ausdruecke verwenden. In der Regel wird wird es selten vorkommen, dass es 0 Datensaetze gibt, allerdings gibt es nicht nur eine Zeitraum, der passen muss, sondern hat jeder DS auch noch einen Bearbeitungsstatus und andere Bedingungen die erfüllt werden. Dies in den Ausdruck einzubauen ist nicht das Problem. Zwar hält es sich noch in Grenzen trotzdem muesste zu jedem Fall ein Pseudodatensatz existieren.

Ob nur ueber Monat oder wirklich täglich bedeutet ja mehr oder weniger nur eine andere Formatierung des Datums.

Hatte irgendwie gedacht es gibt eine Datefunktion in der man den zeitraum eintragen kann die stekkt ne art view zur verfuegung und man prüft ob es zu jedem vies ds einen realen datensatz gibt. naja egal ich probiere mal so rum
danke nochmal
jma
 
> Ob nur ueber Monat oder wirklich täglich bedeutet ja mehr oder weniger nur eine andere Formatierung des Datums
Nun ja, das würde bedeuten, dass in der Hilfstabelle für jeden Tag ein Eintrag existieren muss und nicht nur für jeden Monat.

Von deinem Programm aus kannst du ja testen ob es für jeden Monat einen Eintrag hat. Durch den Right join wirst du mit den anderen Bedingungen keine Probleme bekommen.

Ich weiss nicht genau wie dein Programm arbeitet, aber ich würde im Programm selbst testen, ob ein Monat nicht vorgekommen ist, und falls dem so ist, für die Weiterverarbeitung der Daten den Monat sowie die Menge 0 weitergeben.
 
Jep genauso mach ich es jetzt prüfe halt direkt in der Anwendung, und hole mit entsprechend die Daten.
Danke nochmals
gruss jma
 
Zurück