ä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 TTableint 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............9die Lösund die ich suche soll mir diesen Ergebnis liefern:
Titel...........Stunden
-----------------------
Titel1.............8
Titel2.............11und 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 beisums.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.