Das ist eine wirklich gute Frage. Ich habe hier bereits einige nützliche Antworten gelesen, aber wahrscheinlich kann ich eine genauere Erklärung hinzufügen.
Das Reduzieren der Anzahl der Abfrageergebnisse mit einer GROUP BY-Anweisung ist einfach, solange Sie keine zusätzlichen Informationen abfragen. Nehmen wir an, Sie haben die folgende Tabelle "Standorte".
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Nun die Abfrage
SELECT country FROM locations
GROUP BY country
wird darin enden, dass:
--country--
France
Poland
Italy
Allerdings die folgende Abfrage
SELECT country, city FROM locations
GROUP BY country
... wirft einen Fehler in MS SQL aus, denn wie kann Ihr Computer wissen, welche der drei französischen Städte "Lyon", "Paris" oder "Marseille" Sie im Feld rechts von "Frankreich" lesen möchten?
Um die zweite Abfrage zu korrigieren, müssen Sie diese Informationen hinzufügen. Eine Möglichkeit, dies zu tun, besteht darin, die Funktionen MAX () oder MIN () zu verwenden und den größten oder kleinsten Wert unter allen Kandidaten auszuwählen. MAX () und MIN () gelten nicht nur für numerische Werte, sondern vergleichen auch die alphabetische Reihenfolge der Zeichenfolgenwerte.
SELECT country, MAX(city) FROM locations
GROUP BY country
wird darin enden, dass:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
oder:
SELECT country, MIN(city) FROM locations
GROUP BY country
wird darin enden, dass:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Diese Funktionen sind eine gute Lösung, solange Sie Ihren Wert an beiden Enden der alphabetischen (oder numerischen) Reihenfolge auswählen können. Aber was ist, wenn dies nicht der Fall ist? Nehmen wir an, Sie benötigen einen Wert mit einem bestimmten Merkmal, z. B. beginnend mit dem Buchstaben 'M'. Jetzt wird es kompliziert.
Die einzige Lösung, die ich bisher finden konnte, besteht darin, Ihre gesamte Abfrage in eine Unterabfrage zu stellen und die zusätzliche Spalte außerhalb von Hand zu erstellen:
SELECT
countrylist.*,
(SELECT TOP 1 city
FROM locations
WHERE
country = countrylist.country
AND city like 'M%'
)
FROM
(SELECT country FROM locations
GROUP BY country) countrylist
wird darin enden, dass:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
das bei dir nicht?