2010-06-25 6 views
0

J'ai une table MySQL qui ressemble à peu près comme:combiner les lignes de comptage dans MySQL

value | count 
------------- 
Fred | 7 
FRED | 1 
Roger | 3 
roger | 1 

qui est, il a été créé avec ops chaîne en dehors de MySQL, de sorte que les valeurs sont et trailing- Case- sensible aux espaces blancs.

Je veux que ça ressemble à:

value | count 
------------- 
Fred | 8 
Roger | 4 

C'est, géré par MySQL, avec value une clé primaire. Ce n'est pas important lequel (de "Fred" ou "FRED") est gardé.

Je sais comment faire cela dans le code. Je sais aussi comment générer une liste de valeurs de problèmes (avec une auto-jointure). Mais je voudrais proposer une mise à jour SQL/supprimer pour migrer ma table, et je ne peux penser à rien. Si je savais qu'aucune paire d'enregistrements avait des variantes d'une valeur, avec le même nombre (comme ("Fred", 4) et ("FRED", 4)), alors je pense que je peux le faire avec un auto-joint pour copier les comptes, puis une mise à jour pour supprimer les zéros. Mais je n'ai pas une telle garantie.

Y at-il quelque chose de simple qui me manque, ou est-ce l'un de ces cas où vous écrivez juste une courte fonction en dehors de la base de données?

Merci!

+0

vous devez normaliser vos chaînes avant l'insertion, vous vous sauver beaucoup d'ennuis – mcabral

+0

mcabral: en général, je suis d'accord, bien que dans le contexte de mes données réelles, il ne sait pas ce qui normalisé ». – Ken

Répondre

1

Etrangement, MySQL semble faire cela pour vous. Je viens de tester cela dans MySQL 5.1.47:

create table c (value varchar(10), count int); 
insert into c values ('Fred',7), ('FRED',1), ('Roger',3), ('roger',1); 

select * from c; 

+-------+-------+ 
| value | count | 
+-------+-------+ 
| Fred |  7 | 
| FRED |  1 | 
| Roger |  3 | 
| roger |  1 | 
+-------+-------+ 

select value, sum(count) from c group by value; 

+-------+------------+ 
| value | sum(count) | 
+-------+------------+ 
| Fred |   8 | 
| Roger |   4 | 
+-------+------------+ 

je fus surpris de voir MySQL transformer les chaînes comme ça, et je ne suis pas sûr que je peux expliquer pourquoi il a fait cela. Je m'attendais à avoir à obtenir quatre lignes distinctes, et d'avoir à utiliser certaines fonctions de chaîne pour mapper les valeurs à une forme canonique.

+0

Cela ne change pas les noms, votre clause GROUP BY utilise simplement la première occurrence comme valeur dans le jeu de résultats; les deux sont nom de cas. – JYelton

+0

avez-vous essayé avec différentes quantités d'espaces de fin? – mcabral

+0

@mcabral: Cela ne devrait avoir d'importance que si le type de données est CHAR –

2

À titre d'exemple de la façon d'obtenir les résultats que vous recherchez avec une seule requête SQL:

SELECT UPPER(value) AS name, SUM(count) AS qty FROM table GROUP BY name; 

Si vous faites une nouvelle table pour maintenir les valeurs correctes, vous insérez la requête ci-dessus pour remplir la nouvelle table comme si:

INSERT INTO newtable (SELECT UPPER(value) AS name, SUM(count) AS qty FROM table GROUP BY name);