hallo,
ich versuche verschweifel eine ganz einfache SQL in VBA access einzubinden.
ich habe eine Tabelle mit namen und ich möchte wissen wieviele einträge mit den namen Peter gibt.
Tabelle:total
Feld:name (definiert wie text)
Sowiel ich weiss diese sql anweisung ist korrekt
--------------------------------------------------
SELECT Count(total.name) AS zahlname
FROM total
HAVING (((Count(total.name))="Peter"));
--------------------------------------------------
bekomme folgenden fehlermedng
Datentypen übereinstimmen nicht
ich denke, das liegt daran, weil das Feld "name" als text deklariert.
Kann mir bitte jemand sagen, was in diese anweisung falsch ist?
und entsprechend anpassen ?
danke für eure Hilfe
logo
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Bei Feld- und Tabellennamen mit dem Namen "name" solltest Du extrem vorsichtig sein, "name" ist ein geschützter Begriff.
Zeichenketten werden mit einfachen Hochkommata abgegrenzt.
Der Having-Block schränkt die Ergebnismenge nach der Aggregatfunktion ein, wobei Du hier nur Daten verwenden solltest, die im Select-Block erstellt werden.
Dim strSQL As String
Dim strName As String
strName = "Peter"
strSQL = "SELECT total.[name], COUNT(total.[name]) AS ZahlName " & _
"FROM total " & _
"WHERE (total.[name] = '" & strName & "') " & _
"GROUP BY total.[name] " & _
"ORDER BY total.[name];"
Debug.Print strSQL
Und dann solltest Du bedenken, daß Dein Code nur die Felder berücksichtigt, in denen "Peter" steht, "peter" wird nicht berücksichtigt. Wie die entsprechende Funktion in Access heißt, weiß ich im Moment nicht, aber versuche es mal mit UPPER, UPCASE oder UCASE und UCase$(strName).
Hi!
Count() liefert die Zahl der gefundenen Datensätze zurück. Du vergleichst diese Zahl mit einem String, was natürlich nicht gehen kann.
Du willst offenbar alle Datensätze zählen, die "Peter" enthalten.
Der SQL-Dialekt, den ich nutzen muss, kennt solche Konstrukte ebenfalls. HAVING ist dort allerdings nur auf Felder anwendbar, die über eine Gruppierung (GROUP BY), zusammengefasst wurden.
Ich würde das ohne GROUP BY/HAVING erledigen. Die Beschränkung auf Datensätze mit name="Peter" würde im normalen WHERE-Part ohne Gruppierung erfolgen:
SELECT COUNT(*):zahlname
FROM total
WHERE total.name = "Peter"
Dir scheint eher vorzuschweben die Datensätze erst nach dem Namen zu gruppieren und dann zu vergleichen. Das würde bei mir etwas so aussehen:
SELECT total.name, COUNT(*):zahlname
FROM total
GROUP BY total.name
HAVING total.name = "Peter"
Wobei ich das eher als Möglichkeit zur weiteren Selektion der gruppierten Daten sehe. Als Beispiel währe dann folgendes machbar:
HAVING COUNT(*) > 1
Damit würden dann alle total.name geliefert, die mehrfach im Tabelle total vorkommen.
Wobei ich jetzt auch nicht wüsste, ob mein Compiler beide HAVING-Varianten schlucken würde (das Problem ist bei mir die arg eingeschränkte SQL-Syntax, die nicht wirklich viel zulässt, dafür aber unterschiedliche Datenbanken nutzen kann).
Ich nutze eigentlich immer die erste Variante (ohne GROUP BY/HAVING).
Bis dann
Andreas