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.mm

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


Log in to reply