ähnlich wie die sql "group by" aber für Table.



  • Hallo,
    ich möchte das gleiche wie die sql Anfrage "SELECT titel,
    SUM(stunden) FROM table GROUP BY titel" aber nur für table, ich benutze ein FlatFile Table-Komponent die kein SQL benutzt und möchte das gleiche Ergebniss wie bei den SQL Anfrage aber über der Table-Component. sowas [vielleicht] wie:

    while(!table->Eof)
    {
    //.....
    }

    danke



  • Hallo

    😕
    ich kenne deine Komponente nicht, abe wenn die kein SQL unterstützt, must du das manuell aus den Datensätzen zusammensetzen.
    Also so wie du es schon angefangen hast. Ich gehe mal davon aus das das Table-Objekt sich genauso verhält wie ein normales TTable

    int sum = 0;
    while(!table->Eof)
    {
      sum += table->FieldByName("stunden")->AsInteger;
      table->Next();
    }
    

    bis bald
    akari



  • ja, aber damit summierst du die gesamten Stunden, es soll nur die Stunden summieren die den gleichen Titel haben.
    Original Tabelle:

    Titel...........Stunden
    -----------------------
    Titel1............5
    Titel1............3
    Titel2............2
    Titel2............9

    die Lösund die ich suche soll mir diesen Ergebnis liefern:

    Titel...........Stunden
    -----------------------
    Titel1.............8
    Titel2.............11

    und das geht anders, aber wie?



  • Hallo

    im Grunde genauso, nur must du eben in der Schleife noch die Bedingung einbauen.
    Das heißt du machst dir eine std::map, die deine Daten sammelt.

    #include <map>
    ...
    std::map<AnsiString, int> sums; // Neue leere Map, um nach Titel gruppiert die Summen zu erhalten
    std::map<AnsiString, int>::iterator it; // Ergebnis einer Suche in der Map
    AnsiString title;
    
    while(!table->Eof)
    {
      title = table->FieldByName("titel")->AsString;
      it = sums.find(title); // Überprüfen ob bereits für diesen Titel ein Wert vorhanden ist
    
      // Wenn noch kein Wert für Titel, diesen eintragen
      if (it == sums.end())
        sums.insert(std::map<AnsiString, int>::value_type(title, table->FieldByName("stunden")->AsInteger);
    
      // Wenn Wert vorhanden, Wert erhöhen
      else
        it->second += table->FieldByName("stunden")->AsInteger;
      table->Next();
    }
    

    bis bald
    akari



  • vielen dank,
    ich hab's gleich ausprobiert aber bei

    sums.insert(std::map<AnsiString, int>::value_type(title, Table1->FieldByName("Minuten")->AsInteger);
    

    sagt der Copiler:
    Function call missing.



  • Hallo

    abschließende Klammer fehlt

    sums.insert(std::map<AnsiString, int>::value_type(title, Table1->FieldByName("Minuten")->AsInteger));
    

    bis bald
    akari



  • danke noch mal,
    aber wie kann ich diesen Ergebnis ansehen, die Tabelle ändert sich nicht.



  • Hallo

    nein die Tabelle ändert sich nicht, das kann sie so auch gar nicht. Du must die Daten in einem Extra Control darstellen, zum Beispiel in einer ListBox

    // ... map erstellen, direkt danach komplett in ListView ausgeben
    ListBox->Items->Clear();
    for (it = sums.begin(); it != sums.end(); ++it)
    {
      ListBox->Items->Add(it->first + " : " + IntToStr(it->second));
    }
    

    Diese Unflexibilität ist übrigens der Grund, warum von TTable und äquivalenten abgeraten wird.

    bis bald
    akari



  • mensch vielen Dank für dein Antwort.
    es klappt supper.


Anmelden zum Antworten