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