Voilà une très bonne question. J'ai déjà lu quelques réponses utiles ici, mais je peux probablement ajouter une explication plus précise.
La réduction du nombre de résultats de requête avec une instruction GROUP BY est facile tant que vous ne recherchez pas d'informations supplémentaires. Supposons que vous obteniez le tableau suivant «emplacements».
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Maintenant, la requête
SELECT country FROM locations
GROUP BY country
aura pour résultat:
--country--
France
Poland
Italy
Cependant, la requête suivante
SELECT country, city FROM locations
GROUP BY country
... lance une erreur dans MS SQL, car comment votre ordinateur pourrait-il savoir laquelle des trois villes françaises "Lyon", "Paris" ou "Marseille" vous voulez lire dans le champ à droite de "France"?
Afin de corriger la deuxième requête, vous devez ajouter ces informations. Pour ce faire, vous pouvez utiliser les fonctions MAX () ou MIN () en sélectionnant la valeur la plus grande ou la plus petite parmi tous les candidats. MAX () et MIN () ne s'appliquent pas seulement aux valeurs numériques, mais comparent également l'ordre alphabétique des valeurs de chaîne.
SELECT country, MAX(city) FROM locations
GROUP BY country
aura pour résultat:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
ou:
SELECT country, MIN(city) FROM locations
GROUP BY country
aura pour résultat:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Ces fonctions sont une bonne solution tant que vous êtes d'accord avec la sélection de votre valeur dans les deux extrémités de l'ordre alphabétique (ou numérique). Mais que faire si ce n'est pas le cas? Supposons que vous ayez besoin d'une valeur avec une certaine caractéristique, par exemple en commençant par la lettre «M». Maintenant, les choses se compliquent.
La seule solution que j'ai pu trouver jusqu'à présent est de mettre l'intégralité de votre requête dans une sous-requête et de construire la colonne supplémentaire en dehors d'elle à la main:
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
aura pour résultat:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
fonctionne pas pour vous?