Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Select Count Distinct

Begonnen von MaxP, Juni 12, 2024, 18:07:49

⏪ vorheriges - nächstes ⏩

MaxP

Hallo zusammen,

ich wollte eine Abfrage mit Select Count (Distinct <Spaltenname>) ... erstellen,
jedoch wird mir wegen der Verwendung von DISTINCT immer ein Syntaxfehler angezeigt.

Lt. Internet müsste das eigentlich funktionieren. Wo ist der Fehler?

Gruß
Max
Win 10 pro 64 bit, Access 2003

MzKlMu

#1
Hallo,
wieso zeigst du die Abfrage nicht?

Was hast Du denn mit der Abfrage überhaupt vor bzw. was soll die machen ?
Gruß
Klaus

ebs17

ZitatLt. Internet müsste das eigentlich funktionieren.
Wirf das Internet, was Du verwendest, weg.

DISTINCT bewirkt ein Gruppieren ohne alles weitere.
Wenn Du Zählen willst, dann über alles ohne Gruppieren oder mit Gruppieren per GROUP BY.

Deine Variante ist ein freies Zusammenreimen an nötiger Syntax vorbei.
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: ebs17 am Juni 12, 2024, 20:19:18Deine Variante ist ein freies Zusammenreimen an nötiger Syntax vorbei.
Nö.
Seine Variante ist gültiges SQL gemäß ANSI Standard. - Access/ACE/Jet versteht es nur wiedereinmal nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Wenn in SQL-Dialekten einerseits ein Standard nicht vollständig umgesetzt wird und andererseits im Standard nicht enthaltene Dinge zusätzlich enthalten sind - wird man nötige Syntax am SQL-Dialekt orientieren oder am Standard?
Vergleich von Microsoft Access SQL und ANSI SQL
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: ebs17 am Juni 13, 2024, 09:53:47[...] wird man nötige Syntax am SQL-Dialekt orientieren oder am Standard?
Vergleich von Microsoft Access SQL und ANSI SQL
Interessant, dass sogar genau dieses Konstrukt explizit im Vergleich erwähnt wird.
Natürlich wird man erfolgreicher arbeiten, wenn man sich an den Möglichkeiten des jeweiligen konkreten Systems orientiert und nicht am theoretischen Standard. - "Freies Zusammenreimen" ist eine Orientierung am Standard jedoch nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MaxP

Zitat von: MzKlMu am Juni 12, 2024, 19:01:21Hallo,
wieso zeigst du die Abfrage nicht?

Was hast Du denn mit der Abfrage überhaupt vor bzw. was soll die machen ?

In der Spalte ID stehen Werte z.B. 1,1,5,24,24,58
Die SQL-Abfrage soll ohne Duplikate zählen und dann als Ergebnis 4 liefern.
Win 10 pro 64 bit, Access 2003

MzKlMu

#7
Hallo,
da fallen mir nur 2 Abfragen ein:

Abfrage 1 ermittelt die Datensätze ohne Duplikate.

SELECT ID
FROM TabellenName
GROUP BY ID

Abfrage 2 verwendet diese gespeicherte Abfrage zur Zählung.

SELECT Count(ID) AS AnzahlDS
FROM AbfrageName

Ich bin aber nicht der SQL Spezialist. Möglicherweise gibt es auch Lösungen mit einer Abfrage.

Doch noch eine andere Lösung gefunden.
SELECT Count(ID) AS AnzahlvonID
FROM (
SELECT ID
FROM TabellenName
GROUP BY ID
)
Gruß
Klaus

PhilS

Zitat von: MzKlMu am Juni 13, 2024, 15:07:32Möglicherweise gibt es auch Lösungen mit einer Abfrage.
Man kann die beiden Abfragen in eine packen, wenn man die erste Abfrage als Subselect formuliert:
SELECT Count(DistinctId)
FROM (
        SELECT DISTINCT ID AS DistinctId
        FROM DieTabelle
          )  AS  DistinctQuery;
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

@Philipp

während Du geantwortet hast, ist mir auch die Lösung eingefallen.

Aber, was mir auffällt, meine Lösung funktioniert auch ohne den Alias "DistinctQuery".
Erst wenn man aus der SQL zur Entwurfsansicht wechselt und speichert wird in SQL auch das Alias angehängt.
Außerdem habe ich gruppiert und Du hast DISTINCT verwendet.
Macht das einen Unterschied ?
Gruß
Klaus

PhilS

Zitat von: MzKlMu am Juni 13, 2024, 16:15:04Macht das einen Unterschied ?
Von der Ausführung und dem Ergebnis her macht das sicherlich keinen Unterschied. Ich finde das DISTINCT im aktuellen Zusammenhang schöner zu lesen, weil es die Intention klarer kommuniziert als ein Group By.

Bzgl. des Alias habe ich mir angewöhnt immer einen hinzuschreiben, weil er von der jeweiligen Datenbankengine meistens gefordert wird, unabhängig davon ob er eine echte Funktion in der Abfrage hat oder nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

ZitatMacht das einen Unterschied ?
Ich glaube, ich habe mal einen Test gelesen, wo per Messung festgestellt wurde, dass das GROUP BY etwas schneller sei. Da braucht man aber dramatische Datenmengen, um das spüren zu können. Da sollte man eher an den Index für das Feld denken, der da wegen der vergleichenden Operation einen erheblichen Einfluss haben wird. Von der Lesbarkeit her würde ich auch DISTINCT bevorzugen.

Tabellen-Alias für Unterabfrage - würde ich auf jeden Fall selber setzen, ein X genügt, das wirkt nicht nach außen und keiner sieht es. Der Tabellenalias, der von Access durch Umschalten in die Entwurfsansicht vergeben wird, sieht da eher wie eine Fehlermeldung aus und kann zu Verwirrungen führen.

Wegen des Unterschieds: COUNT(*) ist auch etwas schneller als COUNT(Feldname), weil nur Datensätze gezählt werden und nicht auf Feldinhalte geprüft wird. Beim Aggregieren von Feldinhalten werden NULL-Inhalte nicht berücksichtigt, also ist da eine zusätzliche Inhaltsprüfung nötig.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,

vielen Dank für Eure Erläuterungen.
Gruß
Klaus

MaxP

Das Thema scheint ja doch nicht so einfach zu sein.

Jedenfalls habe ich nun eine/zwei Lösung(en) und dafür vielen Dank an Euch!

Gruß
Max
Win 10 pro 64 bit, Access 2003