2009-02-25 10 views
3

Si j'ai un ensemble d'enregistrementsgroupe SQL par

name amount Code 
Dave 2   1234 
Dave 3   1234 
Daves 4   1234 

Je veux que ce groupe basé sur le code Nom &, mais la dernière ligne a une faute de frappe dans le nom, donc ce groupe coutume.

Quelle serait la meilleure façon de les regrouper comme:

Dave/Daves 9 1234

Répondre

1

Fix la faute de frappe? Sinon, le regroupement sur le nom va créer un nouveau groupe.

La réparation de vos données devrait être votre plus haute priorité au lieu d'essayer de trouver des moyens de contourner ce problème.

Il convient également de noter que si vous avez cette seule faute de frappe dans vos données, il est probable que vous ayez (ou que vous ayez à un moment donné dans le futur) des données encore plus vicieuses qui ne rentreront pas dans votre code, ce qui va vous forcer à inventer de plus en plus de "work-arounds" pour y faire face, alors que vous devriez vous concentrer sur la propreté de vos données.

4

Si c'est une solution de contournement, essayez

SELECT cname, SUM(amount) 
FROM (
    SELECT CASE WHEN NAME = 'Daves' THEN 'Dave' ELSE name END AS cname, amount 
    FROM mytable 
) 
GROUP BY cname 

Ce cours se traitera que ce cas précis.

5

En règle générale, si les données sont erronées, vous devez corriger les données.

Toutefois, si vous voulez quand même faire le rapport, vous pouvez créer un autre critère à grouper, par exemple LEFT (Nom, 4) effectuera un regroupement sur les 4 premiers caractères du nom.

Vous pouvez également considérer l'instruction CASE comme une méthode (CASE WHEN name = 'Daves' THEN 'Dave' ELSE name), mais je n'aime vraiment pas cette méthode, surtout si vous proposez d'utiliser cette méthode pour toute autre chose, alors un rapport unique.

1

Pour MySQL:

select 
    group_concat(distinct name separator '/'), 
    sum(amount), 
    code 
from 
    T 
group by 
    code 

Pour MSSQL de group_concat() peut être mis en œuvre comme agrégat .NET personnalisé.

+0

Ceci est probablement la meilleure réponse pour la question exacte telle que publiée, mais pourrait conduire à la laideur sur la route lorsque vous vous retrouvez avec des résultats qui ressemblent à "Dave/DaveS/dave/DAVES/DaveICantTypeRight" – TheTXI

+0

Je suis tous pour l'assainissement des données, mais pour éliminer les mauvaises données, vous devez toujours l'interroger. – Constantin

1

Si le champ de nom est supposé être une clé, alors l'hypothèse doit être que Dave et Daves sont deux éléments différents tous ensemble, et doivent donc être groupés différemment. Si toutefois c'est une faute de frappe, alors comme d'autres l'ont suggéré, corrigez les données.

Regrouper sur un champ de texte saisi à forme libre si tel est le cas, aura toujours des problèmes. La saisie des données n'est jamais 100%.

Pour moi, il est plus logique de grouper sur le code seul si c'est le champ clé et de laisser le nom hors du groupe tous ensemble.