Statistiken erstellen mit SQL anweisung
-
Hallo,
in meinem Programm habe ich eine Datenbank und ein DBChart mit der ich eine Statistik erstellen möchte.
In meiner Tabelle gibt 2 Werte Datum und Dauer.
Der Wert in der Spalte Datum wird so dargestellt: TT.MM.JJJJ
Der Wert in der Spalte Dauer so: hh.mmNun möchte ich eine Statistik erstellen über die gesamte Dauer in einem Monat. Dabei sollen alles verfügbaren Monate die in der Tabelle drin sind in der YAchse stehen und die gesamte Dauer in der X Achse.
Meine Y Achse ist als "YAchse" und die X Achse als "XAchse" deklariert.
Ich habe das ganze so probiert:"Select Sum(Dauer) AS XAchse, MONTH(Datum) AS YAchse FROM Tabelle1 GROUP BY MONTH(DATUM) ORDER BY MONTH(Datum) ASC"
Kann mir jemand sagen wo mein Fehler liegt?
Danke
-
was geht nicht?
wie lautet die Fehlermeldung?
welche Datenbank wird verwendet?
-
Eine Access Datenbank und die Fehlermeldung lautet "Datentypen in Kriterienausdruck unverträglich"
-
Hallo
Nun möchte ich eine Statistik erstellen über die gesamte Dauer in einem Monat. Dabei sollen alles verfügbaren Monate die in der Tabelle drin
Ich habe dir doch bereits schon gesagt, das MONTH nur die reinen Monate vergleicht, aber keinen Unterschied zwischen den Jahren macht! Also wäre zum Beispiel der 2.10.2005 im selben Monat wie der 2.10.2006.
Du must dann ebenfalls noch das Jahr vergleichen.Tip : teste die Abfrage mit einem geeigneten Frontend (in deinem Fall MS Access selber), und las dich ins DB-Forum verschieben, denn mit dem Builder hat das ja nichts mehr zu tun.
bis bald
akari
-
sind die Spalten "Datum" und "Dauer" vom Typ DateTime? oder sind das Textspalten?
-
Datum ja, die Dauer ist aber eine Textspalte, was funktionieren müsste denn nur Datum muss dem Typ DateTime zugeordnet werden.
-
Wäre mir neu, dass man, ohne zu casten, Textspalten addieren kann...
-
Es geht aber, dort stehen ja nur Zahlen drin. Habe schon mit dieser Spalte ander Statistiken erstellen lassen und es funktioniert, daran liegt also nicht das Problem.
-
Ok, es geht!
Der Fehler lag an einer Einstellung von DBChart, also so wie ich den Quelltext bzw. die SQL Anweisung gepostet habe funktionierts.
Jetzt aber noch eine kleine Frage zum Schluss.In meinem DBChart werden nun unten (YAchse) die Monate in 01 02 03 04...angezeigt. Ich möchte aber das dort Jan Feb Mrz Apr steht, kann ich die Ergebnisse von der SQL Abfrage ändern, wenn ja wie????????
-
So spontan fallen mir da berechnete Felder ein.
-
Hallo
also noch einmal
akari schrieb:
Ich habe dir doch bereits schon gesagt, das MONTH nur die reinen Monate vergleicht, aber keinen Unterschied zwischen den Jahren macht! Also wäre zum Beispiel der 2.10.2005 im selben Monat wie der 2.10.2006.
Du must dann ebenfalls noch das Jahr vergleichen.bis bald
akari
-
Und das heißt?
-
Hallo
das sollte ungefähr so aussehen
Select Sum(Dauer) AS XAchse, CONCAT(MONTH(Datum), '-', YEAR(Datum)) AS YAchse FROM Tabelle1 GROUP BY MONTH(Datum), YEAR(Datum) ORDER BY YEAR(Datum), MONTH(Datum) ASC
bis bald
akari
-
Mit "Und das heißt" war die Frage auf die Antwort Jow_M bezogen. Ich weiß selbst das ich die Jahre noch Filtern muss. Das ist aber jetzt nicht mein Problem.
Ich möchte wissen wie ich die Anzeige im DBChart auslese und anders beschrifte z.B 01=Jan 02=Feb usw.Danke
-
Nun ja, im Feldeditor der Query klickst Du mit der rechten Maustaste und wählst 'Neues Feld'. Wichtig ist, dass Du 'berechnet' anwählst und den Typ auf String stelltst. Größe 3 sollte reichen (wenn Du immer nur 3 Buchstaben haben willst. Wenn Du das Feld angelegt hast, schaust Du die Methode GetText() an. Dort wertest Du die Monatszahl aus und gibst den Monatsstring in der Variable Text zurück.
-
Habe mir die Methode angeschaut. Habe aber dazu kein Bespiel gefunden und verstehe nicht so ganz wie ich nun die Variablen auslese und diese umbenenne bzw. in mein DBChart bringe.
Bitte noch eine kleine Hilfe!
Danke
-
Im DBChart steht sie dir wie eine ganz normales Feld aus der Tabelle zur Verfügung. In der GetText() mußt Du sie nur mit 'beleben'.
Das könnte zB so aussehen:
Das Feld habe ich 'Monatsname' benannt.void __fastcall TForm1::ADOQuery1MonatsnameGetText(TField *Sender, AnsiString &Text, bool DisplayText) { // Format YAchse MM-YYYY AnsiString YAchse = ADOQuery1->FieldByName("YAchse")->AsString; if (YAchse.AnsiPos("-")) { int iPos = YAchse.AnsiPos("-"); int iMonat = YAchse.SubString(1, pos - 1).ToInt(); // Monat als int ermitteln YAchse = YAchse.Delete(1, pos); // YAchse enthält jetzt nur noch die Jahreszahl switch (iMonat) { case 1: Text = "Jan"; break; // díe restlichen hier einfügen... case 12: Text = "Dez"; break; } Text += " " + YAchse; // Jahreszahl wieder anhängen } else Text = "FEHLER"; }
Da fehlt natürlich noch ein bißchen was an Überprüfungen... (es gibt z.B. ne böse Fehlermeldung, wenn ToInt() fehlschlägt)