Как получить сводную таблицу, как результат, используя MySQL - PullRequest
1 голос
/ 27 сентября 2019

Предположим, у нас есть таблица в mysql: test;
как получить таблицу результатов, такую ​​как сводная таблица в Excel?

Пытался использовать "слияние", но MySQL не поддерживает его.

Пытался использовать "союз", но увеличивается индекс, а не столбец.

select * from test;

Вывод

+----+------------+------+-------+
| id | date       | name | value |
+----+------------+------+-------+
|  1 | 2019-01-01 | a    |     1 |
|  2 | 2019-01-02 | a    |     2 |
|  3 | 2019-01-03 | a    |     3 |
|  4 | 2019-01-04 | a    |     4 |
|  5 | 2019-01-05 | a    |     5 |
|  6 | 2019-01-06 | a    |     6 |
|  7 | 2019-01-03 | b    |     9 |
|  8 | 2019-01-04 | b    |     9 |
|  9 | 2019-01-05 | b    |     8 |
| 10 | 2019-01-06 | b    |     7 |
| 11 | 2019-01-05 | c    |     5 |
| 12 | 2019-01-06 | c    |     6 |
| 13 | 2019-01-07 | c    |     7 |
| 14 | 2019-01-08 | c    |     8 |
| 15 | 2019-01-09 | c    |     9 |
+----+------------+------+-------+

Требуется получить:

+------------+---+---+---+
| date       | a | b | c |
+------------+---+---+---+
| 2019-01-01 | 1 |   |   |
| 2019-01-02 | 2 |   |   |
| 2019-01-03 | 3 | 9 |   |
| 2019-01-04 | 4 | 9 |   |
| 2019-01-05 | 5 | 8 | 5 |
| 2019-01-06 | 6 | 7 | 6 |
| 2019-01-07 |   |   | 7 |
| 2019-01-08 |   |   | 8 |
| 2019-01-09 |   |   | 9 |
+------------+---+---+---+

Я знаю, что очень легко получить результат в Excel, но как использовать SQL?

Редактировать:

Следующий вопрос.

Что если я НЕ знаю, какие имена в столбце "имя"?

То есть, могут быть a, b, c, d, e, f, g ... но я НЕ знаю, сколько существует разных имен.

Как получитьрезультат, перечислив их всех?()

+------------+---+---+---+
| date       | a | b | c |...... and so on.
+------------+---+---+---+

1 Ответ

2 голосов
/ 27 сентября 2019

Вы можете использовать CASE с GROUP_CONCAT, чтобы получить желаемый результат.И хорошей практикой является избегать зарезервированных слов, таких как name, date, value

SELECT date,
GROUP_CONCAT(CASE WHEN name='a' THEN value END) as 'a', 
GROUP_CONCAT(CASE WHEN name='b' THEN value END) as 'b', 
GROUP_CONCAT(CASE WHEN name='c' THEN value END) as 'c' 
FROM test GROUP BY `date`;

Редактировать: Это может быть достигнуто путем создания динамического запроса с использованием prepared statement.

Поскольку value суммируется для столбца в конкретную дату, совместное использование запроса с SUM.При необходимости вы можете заменить на GROUP_CONCAT.

SELECT 
GROUP_CONCAT(CONCAT(" SUM(CASE WHEN name='",name,"' THEN value END) AS '",name,"'")) 
INTO @pivotcol
FROM (SELECT `name` FROM test GROUP BY `name`) t;

SET @pivotquery =CONCAT("SELECT date, ",@pivotcol," from test GROUP BY `date`");

PREPARE stmt FROM @pivotquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
...