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



  • @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



  • @wob Oh, alles klar. Habe ich noch nie ohne asbenutzt. Wieder was gelernt, sehr gut.


Log in to reply