2017-08-30 5 views
0

Je veux obtenir le nombre de lignes pour chaque valeur distincte dans la colonne A regroupés par colonne B comme ceci:MySQL nombre restreint de valeurs distinctes dans les colonnes séparées

------------------------------------------------------ 
| B | AValue1 | AValue2 | Avalue3 | AValue4 | ...... | 
------------------------------------------------------ 
|B1 | x | x | x | x | x | 
|B2 | x | x | x | x | x | 
|...| x | x | x | x | x | 
------------------------------------------------------- 

x étant les différents chefs d'accusation. En ce moment, je reçois essentiellement les mêmes données à l'aide « Grouper par (A, B) » mais il est sous la forme:

---------------------------------------------- 
| A   | B  | Count    | 
----------------------------------------------  
| AValue1 | BValue1 |  x    | 
| ...  | ....  |  x    | 
---------------------------------------------- 

après quoi je dois transformer les données en PHP ou sur le client Javascript La seule façon que je pourrais trouver pour obtenir la première table serait de faire une sélection de sous-requête pour chacune des valeurs dans A, mais cela va à l'encontre du but de cette solution plus simple et plus propre. Existe-t-il un moyen facile d'y parvenir en SQL ou la transformation de la table Group By est-elle la meilleure approche? Merci à l'avance

+1

Donc, si colonne 'A' a mille valeurs distinctes, vous voulez un millier de colonnes? – BeetleJuice

+1

https://stackoverflow.com/questions/7674786/mysql-pivot-table – GolezTrol

+0

@BeetleJuice théoriquement oui, bien que dans ce cas je peux être sûr que la colonne aura toujours quelque part autour de 30 valeurs distinctes – RagingPixels

Répondre

0

@ Le commentaire de GolezTrol m'a indiqué dans la bonne direction. MySQL malheureusement ont doesnt PivotTables, mais je réussi à le résoudre en utilisant l'instruction concat du groupe suivant:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(IF(B = ''', 
     B, 
     ''', 1, 0)) AS `', 
     B, 
     '`' 
    ) 
) INTO @sql 
FROM table 
SET @sql = CONCAT('SELECT A, ', @sql, ' FROM table GROUP BY A'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt;