2016-09-05 1 views
-1

Je cherche un moyen de boucler sur des colonnes dans une table MYSQL en utilisant une chaîne concaténée pour indexer les noms de colonnes dans une boucle. Un exemple des données de la table pourrait ressembler à ceci:MYSQL: Comment est-ce que je peux itérer sur des colonnes de table en utilisant une chaîne concaténée comme nom de colonne?

R1  R2  R3  R4  
0.68 0.08 0.04 4.24 
0.15 1.17 3.06 0.57 
1.59 0.48 1.39 1.00 
1.59 0.77 1.13 0.22 
0.90 0.23 0.73 0.52 

Les noms de colonnes sont simplement le caractère « R » et un numéro (en fin de compte le nombre de colonnes varie de sorte que le nombre pourrait être jusqu'à 100) . Je voudrais parcourir les colonnes pour compter le nombre de valeurs dans chaque colonne qui dépassent un seuil (j'utilise trois seuils: 3.0, 5.0 et 10.0). Le résultat de l'appel de la procédure devrait être quelque chose comme ce qui suit:

str2 total ThreeCount FiveCount TenCount 
`R1` 8772 794   153  1 

str2 total ThreeCount FiveCount TenCount 
`R2` 8772 382    42  0 

etc.

J'utilise le code suivant comme une procédure stockée pour tester le processus (j'utilise 5 pour le test et donc itérer au cours des cinq premières colonnes de valeurs de données):

BEGIN 
DECLARE x INT; 
DECLARE str1 VARCHAR(1); 
DECLARE str2 VARCHAR(5); 
DECLARE str3 VARCHAR(1); 

SET x = 1; 
SET str1 = "R"; 
SET str2 = ""; 
SET str3 = "`"; 

WHILE x <= 5 DO 
SET str2 = CONCAT(str3,str1,x,str3); 
select str2, 
    count(*) total, 
    sum(case when str2 > 3.0 then 1 else 0 end) ThreeCount, 
    sum(case when str2 > 5.0 then 1 else 0 end) FiveCount, 
    sum(case when str2 > 10.0 then 1 else 0 end) TenCount 
from test_dat; 
SET x = x + 1; 
END WHILE; 

END 

Cependant, la procédure renvoie zéro des valeurs (sauf pour le total) à moins que je remplace « str2 » avec les noms de colonnes réels (par exemple, remplacer str2 avec R1, R2 etc.). Cependant je préfère ne pas utiliser les noms de colonnes réels.

Que faire pour que ma chaîne concaténée (str2) soit reconnue comme un nom de colonne? J'ai essayé diverses combinaisons de concaténation telles que:

SET str2 = CONCAT(str1,x); 

Mais n'ont pas de comptes non-zéro avec l'un de ceux-ci.

Merci pour toute aide que vous êtes en mesure d'offrir.

+0

Ce genre de problème ne peut pas se produire dans un SGBDR. Une table de base de données n'est pas une feuille de calcul. Normalisez votre schéma. – Strawberry

Répondre

3

Une conception normalisée pourrait ressembler à ceci

id r val 
1 1 0.68  
2 1 0.15  
3 1 1.59  
4 1 1.59  
5 1 0.90  

6 2 0.08  
7 2 1.17  
8 2 0.48  
9 2 0.77  
10 2 0.23 

11 3 0.04  
12 3 3.06  
13 3 1.39  
14 3 1.13  
15 3 0.73  

16 4 4.24 
17 4 0.57 
18 4 1.00 
19 4 0.22 
20 4 0.52 
+0

Merci pour votre suggestion que j'ai mise en place et cela fonctionne bien. Très appréciée. J'aimerais quand même savoir s'il est possible (et si oui comment) d'utiliser une chaîne concaténée comme nom de colonne. Je vous remercie beaucoup pour votre aide. –