2017-08-30 1 views
0

I Spalte B wie dies die Anzahl der Zeilen für jeden eindeutigen Wert in Spalte A gruppiert erhalten möchten:MySQL select count unterschiedlicher Werte in einzelne Spalten

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

x die verschiedenen Zählungen zu sein. Gerade jetzt ich bin immer im Grunde die gleichen Daten „Group By (A, B)“ mit aber es ist in der Form:

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

wonach ich habe die Daten in PHP oder auf dem Client verwandeln in Javascript. Die einzige Möglichkeit, um die erste Tabelle zu bekommen, wäre, eine Unterabfrage für jeden der Werte in A zu treffen, aber das widerspricht dem Zweck, eine einfachere und sauberere Lösung zu sein. Gibt es eine einfache Möglichkeit, dies in SQL zu erreichen, oder ist die Transformation der Group By-Tabelle der beste Ansatz? Danke im Voraus

+1

Also, wenn 'A' Spalte tausend verschiedene Werte hat, werden Sie tausend Spalten wollen? – BeetleJuice

+1

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

+0

@BeetleJuice theoretisch ja, obwohl ich in diesem Fall sicher sein kann, dass die Spalte jemals nur irgendwo um 30 verschiedene Werte haben wird – RagingPixels

Antwort

0

@ GolezTrols Kommentar wies mich in die richtige Richtung. MySQL leider tut Pivot-Tabellen haben, aber ich schaffte es zu lösen die folgende Gruppe concat-Anweisung:

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;