SQL Anweisung
-
Hallo,
ich steh mal wieder auf dem Schlauch.
ich arbeite mit einer Paradox7 Tabelle und dem Builder 6 C++.
Meine TabelleX hat die Felder: 1, 2, 3 und4 mit ca. 250 Datensätzen.
Nun möchte ich die Doubletten aus 1 herausfiltern und mir in meinem DBGrid anzeigen lassen und versuche das wie folgt:
Query->SQL->Add("SELECT 1, COUNT(*) FROM TabelleX GROUP BY 1 COUNT() >1");
oder
Query->SQL->Add("SELECT 1, COUNT(2) FROM TabelleX GROUP BY 2 HAVING COUNT(2) > 1");
oder
Query->SQL->Add("SELECT 1, COUNT(2) FROM TabelleX GROUP BY 1 HAVING (COUNT(2) > 1"));
alle drei Versuche schlagen fehl.Wo liegt mein Denkfehler?
Über eine Tipp oder ein kleines Codeschnipsel wäre ich SUPER dankbar.
LG
Traugott
-
Ich bin mit Paradox7 und Builder 6 nicht aus, aber ich finde die Tabellen Namen sehr schlecht gewählt und würde dir dringend raten, denen vernünftige Namen zu geben.
Mit mySQL wäre das möglich, was du vor hast, wenn die Spaltennamen in Backticks eigeschlossen sind, also:
`1`
Bei Mircrosoft SQL Server muss man Spalten, deren Namen mit einer Zahl beginnen, in eckige Klammern setzen. Ob das mit nur einer Zahl funktioniert, weiß ich nicht.Bei sqlite kann man verschiedene Sachen mit
'
escapen, ob Zahlen als Spaltennamen dazu gehören, weiß ich grade nicht.Bleibt der Rat: damit es sicher funktioniert, gib den Spalten Namen, die nicht mit einer Zahl anfangen und erst recht nicht, nur aus einer Zahl bestehen.
-
Hallo,
1, 2, 3 und 4 haben natürlich Namen (1, 2,... sind nur Platzhalter). Genauso TabelleX hat natürlich einen Namen.
1 = Rot, 2 = Dunkelgelb, 3= Gelb und 4 = Gruen , alle Textfelder (A) und der Tabellenname = Ampeltabelle.
Es würde dann lauten:
Query1->SQL->Add("SELECT Rot, COUNT() FROM Ampeltabelle GROUP BY Rot (COUNT() >1");
Mit den Platzhaltern geht's im Forum halt schneller und benötigt weniger Speicherplatz.Ich habe den Verdacht, dass mit meiner Anweisung etwas nicht stimmt. Mal kennt er kein GROUP BY, das andere Mal kennt er >1 nicht. Daher auch meine Bitte eines kleinen Tipps oder Codeschnipsel.
LG
Traugott
-
@Traugott sagte in SQL Anweisung:
Query1->SQL->Add("SELECT Rot, COUNT() FROM Ampeltabelle GROUP BY Rot (COUNT() >1");
Hm... Ich kenne mich mit deiner DB auch nicht aus, aber es sollte doch heißen:
select Rot, count(*) cnt from Ampeltabelle group by Rot having count(*) > 1;
-
Was soll die Abfrage den zurückliefern? Welches Ergebnis erwartest du bei welchen Daten in der Tabelle?
-
Hallo,
in der Spalte Rot steht z.B. 6 mal der Name Mustermann (von 250 Datensätzen).
Ich möchte angezeigt bekommen, wie oft welcher Name in der Spalte Rot steht.
Z.B.
Spalte Rot, Mustermann, 6
Spalte Rot, Testermann, 3
es sollen die Doubletten angezeigt werden um entscheiden zu können, welchen ich lösche oder nicht.LG
Traugott
-
Genau das macht wob´s Vorschlag.
-
@Traugott sagte in SQL Anweisung:
Mit den Platzhaltern geht's im Forum halt schneller und benötigt weniger Speicherplatz.
Naja, ich würde sagen, der Effekt ist minimal und geht auf Kosten der Fragestellung, da ich den Fehler damit erstmal wo anders vermutet habe. Am Besten ist es 1:1 den Code zu kopieren, den man verwendet.
@wob sagte in SQL Anweisung:
select Rot, count() cnt from Ampeltabelle group by Rot having count() > 1;
fehlt da ein
as
?
select Rot, count(*) as cnt from Ampeltabelle group by Rot having count(*) > 1;
-
@Schlangenmensch sagte in SQL Anweisung:
fehlt da ein as?
Geht zumindest in den DBs, die ich benutze, sowohl mit als auch ohne
AS
.Zum Beispiel
- SQLite: https://www.sqlite.org/syntax/result-column.html (schön am Pfeil zu sehen)
- Postgres: https://www.postgresql.org/docs/13/sql-select.html (AS in eckigen Klammern)
-
@wob Oh, alles klar. Habe ich noch nie ohne
as
benutzt. Wieder was gelernt, sehr gut.
-
Hallo zusammen,
ich bin bald am verzweifeln.
AnsiString Tabelle = "LW\Ordner\Ampeltabelle.db";
Query->SQL->Add("select Rot, count() as cnt from" + Ampeltabelle + " group by Rot having count() > 1");
es kommt die Meldung fehlerhafte String Anweisung "BY".Fehlt vielleicht ein Eintrag in der *h-Datei?
(alle anderen SQL-Anweisungen mit where oder order by laufen fehlerfrei)LG
Traugott
-
@Traugott
in den sql-Dialekten, die ich kenne, muss es count(*) heißen, nicht count()
-
@Belli
Der*
ist eh da, bloss @Traugott ist wohl zu faul seine Beiträge brauchbar zu formatieren, und einfach so reingeklatscht nimmt das Forum dann an dass der erste*
den Anfang eines kursiven Bereichs markiert und der zweite*
das Ende.@Traugott
in den sql-Dialekten, die ich kenne, muss zwischenFROM
und dem Tabellenname ein Leerzeichen rein.Wie wär's wenn du dir den SQL String den du da zusammenbaust auch mal ansiehst bevor du im Forum fragst warum er nicht funktioniert?
Und wie wär's wenn du dir mal ansiehst wie man im Forum hier Beiträge formatiert, so dass man sie dann nachher auch lesen kann?
-
Hallo,
ist der Berg auch noch so steil, .......
So geht es jetzt.Select * From Ampeltabelle Where Rot IN (Select Rot From Ampeltabelle GROUP BY Rot HAVING COUNT(*) >=2) ORDER BY Rot
Den Modus Bearbeiten werde ich auch noch hinbekommen.
Trotzdem Danke für die Anregungen.
LG
Traugott