简体   繁体   中英

MySql pivot table dynamic columns

I've got the following tables in my database:

this is the table km_kondomanager_millesimal_table_values 在此处输入图片说明

this is the table km_kondomanager_millesimal_table 在此处输入图片说明

The two tables are joined together by km_kondomanager_millesimal_table_value_table_id and km_kondomanager_millesimal_table_id

I've managed to creat a pivot table using the followinf query:

SELECT km_kondomanager_millesimal_table_value_building_id
      ,SUM(CASE WHEN km_kondomanager_millesimal_table_value_table_id = 9
                     THEN km_kondomanager_millesimal_table_millesimal_value END) tabella_gruppo_A
      ,SUM(CASE WHEN km_kondomanager_millesimal_table_value_table_id = 10
                     THEN km_kondomanager_millesimal_table_millesimal_value END) tabella_gruppo_B 
FROM km_kondomanager_millesimal_table_values 
WHERE km_kondomanager_millesimal_table_value_group_id = 15
GROUP BY km_kondomanager_millesimal_table_value_building_id

and this is how it looks like:

在此处输入图片说明

My problem is that I need to take the table name from km_kondomanager_millesimal_table and use it as column, these columns are not always the same as you can see in the immage there are other stored in the database. The query I've created requires to specify km_kondomanager_millesimal_table_value_table_id in the case and also to specify the column name in the example tabella_gruppo_A and tabella_gruppo_B. Can anyboby help me to achieve this? Also I need to convert the pit table to HTML table. Many thanks

I've managed to get it sorted using mysql stored procedure and this is the code:

BEGIN
    SELECT

    GROUP_CONCAT(
    CONCAT("MAX(IF(km_kondomanager_millesimal_table_value_table_id='", km_kondomanager_millesimal_table_value_table_id, "',km_kondomanager_millesimal_table_millesimal_value ,NULL)) AS '", km_kondomanager_millesimal_table_name, "'"), "
"
      )INTO @answers
    FROM (
      SELECT DISTINCT km_kondomanager_millesimal_table_value_table_id, km_kondomanager_millesimal_table_name FROM km_kondomanager_millesimal_table_values INNER JOIN km_kondomanager_millesimal_table
                 ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_table_id = km_kondomanager_millesimal_table. km_kondomanager_millesimal_table_id WHERE km_kondomanager_millesimal_table_value_group_id = 13
    ) A;

    SET @query := 
      CONCAT(
        'SELECT km_kondomanager_millesimal_table_value_building_id, ', @answers, 
        ' FROM km_kondomanager_millesimal_table_values WHERE km_kondomanager_millesimal_table_value_group_id = 13 GROUP BY km_kondomanager_millesimal_table_value_building_id'
      );

    PREPARE statement FROM @query;
    EXECUTE statement;
END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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