简体   繁体   English

来自 MySQL 的数据透视表

[英]Pivot table from MySQL

I'm newbie in MySQL i want create pivot table by mysql table like this:我是 MySQL 的新手,我想通过 mysql 表创建数据透视表,如下所示:

My table:我的表:

*------------*-------*----------------*-------*------------*
|    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 |
*------------*-------*----------------*-------*------------*

I want to get this by mysql select (if it is possible)我想通过 mysql select 得到这个(如果可能的话)

*---------------------*------------*------------*------------*------------*------------*
| 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     |
*---------------------*------------*------------*------------*------------*------------*

Thanks for help :)感谢帮助 :)

I found solution this is code for my native table:我找到了解决方案,这是我的本机表的代码:

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;

But now i have question how create from this stmt mysql view?但现在我有疑问如何从这个 stmt mysql 视图创建?

So... it's not possible to execute this stmt on big table:所以......不可能在大表上执行这个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;

We need creat view of month first:我们首先需要创建月份视图:

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. 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. wdt_ID = t1. imieinazwiskopracownika AND t1.datapracy BETWEEN '2020-01-01' AND '2020-01-31' group by t1.datapracy, t2.nowakolumna HAVING COUNT(*) imieinazwiskopracownika AND t1.datapracy BETWEEN '2020-01-01' AND '2020-01-31' group by t1.datapracy, t2.nowakolumna HAVING COUNT(*)

And after create second pivot view from first stmt.在从第一个 stmt 创建第二个枢轴视图之后。 This is solution.这是解决方案。 In the end we should select * from view.最后我们应该从视图中选择*。

Big thanks for help.非常感谢您的帮助。

This is a pretty nice question as there is no pivot functions in MySQL.这是一个很好的问题,因为 MySQL 中没有枢轴函数。 Moreover, you seem to need a dynamic number of columns which makes it a bit more difficult than a fixed and pre-determined number of columns.此外,您似乎需要动态数量的列,这使得它比固定和预先确定的列数要困难一些。

The only way i know to achieve such a pivot in MySQL is to use a prepared statement as below :我所知道的在 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;

SEE FULL DEMO HERE 在此处查看完整演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM