Fonction STRING_AGG
de SQL Server : suppression des valeurs en double
Cet article aborde le défi consistant à éliminer les valeurs en double dans la fonction STRING_AGG
dans SQL Server 2017 et les versions ultérieures. La fonction standard STRING_AGG
ne prend pas directement en charge le mot-clé DISTINCT
pour l'agrégation de valeurs uniques.
Le problème : Utiliser directement DISTINCT
avec STRING_AGG
pour compter et concaténer des valeurs uniques n'est pas possible.
L'objectif : Générer une chaîne concaténée de valeurs uniques à l'aide de STRING_AGG
.
Exemple illustratif :
Considérons un tableau Sitings
avec les colonnes State
, City
et Siting
:
<code>ID | State | City | Siting --------------------------------- 1 | Florida | Orlando | bird 2 | Florida | Orlando | dog 3 | Arizona | Phoenix | bird 4 | Arizona | Phoenix | dog 5 | Arizona | Phoenix | bird 6 | Arizona | Phoenix | bird 7 | Arizona | Phoenix | bird 8 | Arizona | Flagstaff | dog</code>
Une simple requête utilisant COUNT(DISTINCT Siting)
et STRING_AGG(Siting, ',')
donne :
State | City | # Of Types | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Florida | Orlando | 2 | dog,bird |
Arizona | Phoenix | 2 | bird,bird,bird,dog,bird |
Le résultat souhaité, cependant, devrait supprimer les doublons de la colonne « Animaux » pour Phoenix :
State | City | # Of Types | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Florida | Orlando | 2 | dog,bird |
Arizona | Phoenix | 2 | bird,dog |
La solution : une approche à double regroupement
Pour y parvenir, nous utilisons un processus de regroupement en deux étapes avec des expressions de table communes (CTE) :
<code class="language-sql">WITH Sitings AS ( SELECT * FROM (VALUES (1, 'Florida', 'Orlando', 'bird'), (2, 'Florida', 'Orlando', 'dog'), (3, 'Arizona', 'Phoenix', 'bird'), (4, 'Arizona', 'Phoenix', 'dog'), (5, 'Arizona', 'Phoenix', 'bird'), (6, 'Arizona', 'Phoenix', 'bird'), (7, 'Arizona', 'Phoenix', 'bird'), (8, 'Arizona', 'Flagstaff', 'dog') ) AS F (ID, State, City, Siting) ), CTE_Animals AS ( SELECT State, City, Siting FROM Sitings GROUP BY State, City, Siting ) SELECT State, City, COUNT(1) AS [# Of Sitings], STRING_AGG(Siting,',') AS Animals FROM CTE_Animals GROUP BY State, City ORDER BY State, City;</code>
Le résultat : Cette requête produit avec succès le résultat souhaité :
State | City | # Of Sitings | Animals |
---|---|---|---|
Arizona | Flagstaff | 1 | dog |
Arizona | Phoenix | 2 | bird,dog |
Florida | Orlando | 2 | dog,bird |
Cette technique de double regroupement regroupe d'abord par State
, City
et Siting
pour éliminer les doublons au sein de chaque ville, puis regroupe à nouveau par State
et City
pour concaténer les emplacements uniques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!