J'ai besoin de construire une chaîne de Nom, Prénom, Initiale selon les règles suivantes:SQL - concaténation de champ, en fonction de la variable
- Si le Nom est unique, juste retour le Nom
- Si le nom dernier n'est pas unique, mais la première lettre du nom est d'abord le retour unique Nom + première lettre de Prénom
- Si le Nom et premier lette r du prénom sont non unique, renvoyer le nom + la première lettre de Prénom + Moyen Initial.
Par exemple, la table peut être:
MDC MDLast MDFirst MDInit
3 Jones Fred A
21 Smith Sam D
32 Brown Tom E
42 Brown Ted A
55 Smith Al D
La requête doit retourner:
MDC MDFormattedName
3 Jones
21 Smith S
32 Brown TE
42 Brown TA
55 Smith A
J'ai écrit une requête qui fonctionne presque, mais il utilise plusieurs imbriquées requêtes, et aura encore besoin de plusieurs autres pour (éventuellement) faire une solution viable, et est si inefficace. Je suis sûr qu'il existe un moyen «approprié» pour implémenter cela (pour SQL Server 2005, BTW).
C'est ce que j'ai jusqu'ici. Cela ne fonctionne pas, en raison des agrégations que je perds les ID peuvent ne pas faire la jointure finale pour obtenir des paires ID/Nom.
select
CASE
WHEN CountLastFirst > 1 THEN
CASE WHEN MDInit IS NOT NULL THEN MDLastFirst + LEFT(MDInit,1) ELSE MDLastFirst END
WHEN CountLastFirst = 1 AND CountLast > 1 THEN MDLastFirst
ELSE MDLast
END as MDName
FROM
(
select x.MDLast, CountLast, MDLastFirst, CountLastFirst FROM
(
select MDLast,Count(MDLast) as CountLast FROM
MDList
GROUP BY MDLast) as x
INNER JOIN
(select MDLast, MDLastFirst,Count(MDLastFirst) as CountLastFirst FROM
(
select MDLast,
MDLast + ' ' + LEFT(MDFirst,1) as MDLastFirst
From MDList
) as a
GROUP BY MDLastFirst, MDLast) as y ON x.MDLast = y.MDLast
) as z
Très bien, merci. Je n'ai jamais utilisé une expression dans une clause ON auparavant, c'est une bonne technique à connaître. J'essayais de comprendre comment rejoindre l'indice MDC, mais il n'y avait pas de moyen évident de le faire. – BridgetG