Statistiken erstellen



  • Halle ich versuche zur Zeit in meinem Projekt eine Statistik mit hilfe eines DBChart zu erstellen. Leider klappt alles nicht so ganz wie ich das will und da ich dies zum ersten mal mache weiß ich auch gar nicht wo ich anfangen soll. Ich habe eine Datenbank in dieser gibt es eine Spalte die heißt "Hersteller" und in diesem gibt es nur zur Zeit einen Eintrag mit dem Namen "Sony". Jetzt möchte ich das ich mit zwei DataTimePicker eine Datumsbereich auswähler, also von Dataum xxx bis Datum xxx. In dem DBChart soll nun angezeigt werden wie oft an den einzelnen Tagen der Eintrag "Sony" vorkommt. Also soll in der Y Achse sollen die einzelnen Datume stehen und in der X Achse wie oft. z.B 13.01.2006 5 mal. Ich hoffe man konnte meine Frage gut verstehen, weiß nicht wie ich es anders erklären soll.



  • Frage doch per SQL deine Datenbank ab und übergib das resultierende Query an dein DBChart.



  • Und wie mache ichd as bitte? Wie ich schon gesagt habe, dasist das erste mal das ich mit einem DBChart arbeite.



  • hm... naja, vlei so (keine Gewähr, hab lang nix mit SQL gemacht):

    SELECT COUNT(Hersteller) AS Anzahl, Datum 
      FROM Tabelle 
     WHERE Hersteller = 'Sony' 
       AND Datum BETWEEN '01.01.2005' AND '31.12.2005'
     GROUP BY Anzahl
     ORDER BY Datum ASC
    

    Dann machste einen Doppelklick auf dein DBChart und weisst das Query unter Reihen, Datenquelle -> Datenmenge -> Dein Query wählen zu.



  • Fast richtig Sunday. Es muß nach Datum gruppiert werden, nicht nach Anzahl:

    GROUP BY Datum
    


  • Die Select's funktionieren natürlich nur (besonders der Group-Teil auf Datum), wenn Du reine Datum-Werte hast oder bei Datetimes die Time-Werte "nullst".

    z.B. so

    CONVERT(datetime,FLOOR(CONVERT(float, DATUM)))



  • Wo schreibe ich denn diesen Quelltext rein???



  • na in dein Query!

    BCB-Hilfe: TQuery-SQL-ExecSQL (Beispiel) schrieb:

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add("Delete from Country where Name = 'Argentina'");
    Query1->ExecSQL(); // Open() für SELECT



  • Also bei mir klappt es nicht, hab alles so gemacht wie ihr es gesagt habt aber beim ausführen der query kommt bei mir eine Fehlermeldung und das Programm stürzt ab. Hab jetzt schon alles probiert aber es geht einfach nicht. Kann jemand vielleicht mir ein Beispielprogramm schicken oder so, wäre sehr dankbar.



  • Was hast Du wo hereingeschrieben und welche Fehlermeldung kommt?



  • Den Quelltext:

    SELECT COUNT(Hersteller) AS Anzahl, Datum 
      FROM Tabelle 
     WHERE Hersteller = 'Sony' 
       AND Datum BETWEEN '01.01.2005' AND '31.12.2005'
     GROUP BY Anzahl
     ORDER BY Datum ASC
    

    habe ich in die SQL geschrieben also in die Stringanweisungsliste.

    Und den Quelltext:

    Query1->Close(); 
    Query1->SQL->Clear(); 
    Query1->SQL->Add("Delete from Country where Name = 'Argentina'"); 
    Query1->ExecSQL(); // Open() für SELECT
    

    habe ich auf einen Button gelegt. Natürlich habe ich auch den Quelltext auf meine Bedürfnisse abgeänder und nicht 1zu1 übernommen.

    Ich habe gerade eben auch geschaft das es soweit läuft, also es kommt keine Fehlermeldung mehr. Nur in dem DBChart wird nichts angezeigt. Könnt ihr mir sagen was noch fehlt oder was ich falsch gemacht habe?



  • Also, ich habe jetzt noch ein wenig rumprobiert und folgendes hinbekommen. Das DBChart zeigt jetzt EIN Datum an und die Anzahl aller Eintäge. Nur ich möchte ja das das DBChart alle Datume (sagt man das so?) und die jeweiligen Eintrage zu diesem Datum anzeigt. Anders gesagt: Ich habe in meiner Datenbank 5 Eintrage mit dem Hersteller "Sony" am 16.02.2006 und 1 Eintrag am 17.02.2006. In dem DBChart zeigt er aber 6 Einträge am 16.02.2006 an. Das heißt er addiert alle Einträge und zeigt nur ein Datum an. Wo liegt mein Fehler. Ist der Quelltext für die Query qirklich richtig???



  • Da wir nicht wissen, was genau in Deiner Query steht...



  • Dein Select ist falsch! Die gruppierst garantiert nicht nach dem Datum.



  • naja so weit ich mich noch erinnere, heisst BETWEEN soviel wie "von abc (inklusive) bis xyz (exklusive)", d.h. xyz wäre in der menge nicht mehr dabei, wenn das die begrenzung deiner suchabfrage wäre. kann auch sein, dass das von datenbank zu datenbank unterschiedlich ist.

    kannst auch folgendes versuchen:

    ...
    WHERE Datum >= :DatumVon AND Datum <= :DatumBis
    ...
    
    // Datumswerte direkt übergeben (ohne Umformatierung)
    // -> Datumswerte werden vom User über 2 TDateTimePicker selektiert
    Query->ParamByName("DatumVon")->AsDateTime = DateTimePicker1->DateTime;
    Query->ParamByName("DatumBis")->AsDateTime = DateTimePicker2->DateTime;
    


  • An Joe_M: Steht doch oben was in meiner Query steht.

    An caspar_louis: Und wie schreibe ich die Selectanweisung richtig?



  • Between ist inclusive, zumindest bei SQL-Server, wahrscheinlich aber überall.



  • PeterGabel schrieb:

    Natürlich habe ich auch den Quelltext auf meine Bedürfnisse abgeänder und nicht 1zu1 übernommen.

    Woher soll ich wissen, dass Du das nicht auch auf den SQL-SELECT beziehst?

    Zum letzten Mal: Was genau steht in der Query als SELECT-Anweisung? Nicht ungefähr, sondern exakt!

    Sunday schrieb:

    naja so weit ich mich noch erinnere, heisst BETWEEN soviel wie "von abc (inklusive) bis xyz (exklusive)", d.h. xyz wäre in der menge nicht mehr dabei, wenn das die begrenzung deiner suchabfrage wäre.

    BETWEEN ist inklusive der beiden Parameter.



  • okay. ich merk schon, dass ich nicht mehr ganz fit bin im SQL bereich. 🙄



  • Sunday schrieb:

    okay. ich merk schon, dass ich nicht mehr ganz fit bin im SQL bereich. 🙄

    Kommt wieder, wenn Du damit arbeiten mußt. Versprochen... 😉



  • PeterGabel schrieb:

    An Joe_M: Steht doch oben was in meiner Query steht.

    An caspar_louis: Und wie schreibe ich die Selectanweisung richtig?

    SELECT COUNT(Hersteller) as Anzahl, Datum
    FROM Tabelle
    WHERE Hersteller = 'Sony'
    AND Datum BETWEEN '01.01.2005' AND '31.12.2005'
    GROUP BY DATUM // nicht nach Anzahl
    ORDER BY Datum ASC

    Oder

    SELECT COUNT(Hersteller) as Anzahl, Datum
    FROM Tabelle
    WHERE Hersteller = 'Sony'
    AND Datum >= '01.01.2005'
    AND Datum <= '31.12.2005'
    GROUP BY DATUM
    ORDER BY Datum ASC

    Dabei solltest Du aber beachten, daß dass wirklich nur ein Bsp-SQL-String ist. Du solltest die variablen Werte (Hersteller,DatumVon,DatumBis) auch wirklich variabel halten und ggf. in die Parameter des Querys reinpacken. Dann mußt Du nicht bei jeder Wertänderung, den Query-SQL-String neu aufbauen.

    P.S.: Je öfter ich es lese, desto mehr Rechtschreibfehler finde ich.


Anmelden zum Antworten