Сводный стол от MySQL - PullRequest
       1

Сводный стол от MySQL

1 голос
/ 27 января 2020

Я новичок ie в MySQL Я хочу создать сводную таблицу с помощью mysql таблицы, например:

Моя таблица:

*------------*-------*----------------*-------*------------*
|    Name    | Place |  Kind of work  | Hours |    Date    |
*------------*-------*----------------*-------*------------*
| Test Test  |  abc  |      abc       |   5   | 2020-01-20 |
| Test1 Test1|  abc  |      abc       |   6   | 2020-01-21 |
| Test2 Test2|  abc  |      abc       |   7   | 2020-01-21 |
| Test Test  |  abc  |      abc       |   5   | 2020-01-23 |
| Test1 Test1|  abc  |      abc       |   6   | 2020-01-24 |
| Test2 Test2|  abc  |      abc       |   7   | 2020-01-25 |
*------------*-------*----------------*-------*------------*

Я хочу получить это mysql выберите (если это возможно)

*---------------------*------------*------------*------------*------------*------------*
| Name (group by name)| 2020-01-20 | 2020-01-21 | 2020-01-23 | 2020-01-24 | 2020-01-25 |
*---------------------*------------*------------*------------*------------*------------*
| Test Test           |     5      |            |      5     |            |            |
| Test1 Test1         |            |      6     |            |     6      |            |
| Test2 Test2         |            |      7     |            |            |      7     |
*---------------------*------------*------------*------------*------------*------------*

Спасибо за помощь:)

Ответы [ 3 ]

1 голос
/ 29 января 2020

Я нашел решение, это код для моей родной таблицы:

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(datapracy = "', datapracy, '" , liczbagodzin, NULL)) AS "', datapracy, '"'
)
) INTO @sql
FROM wp_wpdatatable_1_1 WHERE datapracy BETWEEN '2020-01-01' AND '2020-01-31';

SET @sql = CONCAT("SELECT imieinazwiskopracownika, ", @sql, " FROM wp_wpdatatable_1_1 GROUP BY imieinazwiskopracownika");

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

Но теперь у меня есть вопрос, как создать из этого stmt mysql view?

1 голос
/ 08 февраля 2020

Итак ... невозможно выполнить этот stmt на большой таблице:

SET SESSION group_concat_max_len =20000; SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(datapracy = "', datapracy, '" , liczbagodzin, NULL)) AS "', datapracy, '"' ) ) INTO @sql FROM STYCZEN2020PF1; SET @sql = CONCAT("create view STYCZEN2020PF2 as SELECT nowakolumna, ", @sql, " FROM STYCZEN2020PF1 GROUP BY nowakolumna"); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

Сначала нам нужно создать представление месяца:

Create or replace view STYCZEN2020PF1 AS Select t2. nowakolumna , t1.datapracy, sum(t1.liczbagodzin) as liczbagodzin from wp_wpdatatable_5 as t2, wp_wpdatatable_1_1 as t1 where t2. wdt_ID = t1. imieinazwiskopracownika AND t1.datapracy BETWEEN '2020-01-01' AND '2020-01-31' group by t1.datapracy, t2.nowakolumna HAVING COUNT(*)

И после создания второго сводного представления из первого stmt. Это решение. В конце мы должны выбрать * из вида.

Большое спасибо за помощь.

0 голосов
/ 27 января 2020

Это довольно хороший вопрос, поскольку в MySQL нет опорных функций. Более того, вам, кажется, нужно динамическое число столбцов c, что делает его немного более сложным, чем фиксированное и заранее определенное количество столбцов.

Единственный известный мне способ достижения такого поворота в MySQL должен использовать подготовленное утверждение, как показано ниже:

SET @sql = NULL;

SELECT
     GROUP_CONCAT(DISTINCT
          CONCAT(
               'MAX(IF(date = ''',
               date,
               ''', hours, NULL)) AS "',
               date,'"'
          )
     ) INTO @sql
FROM test;

SET @sql = CONCAT('SELECT name, ', @sql, ' FROM test GROUP BY name');

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

СМОТРИТЕ ПОЛНУЮ ДЕМО ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...