MySQL/MariaDB: create a pivot table view

后端 未结 2 1153
庸人自扰
庸人自扰 2020-12-22 04:39

Hi have this MySQL (MariaDB) table:

+----+-------+-------+---------+
| id | name  | value | user_id |
+----+-------+-------+---------+
|  1 |         


        
2条回答
  •  独厮守ぢ
    2020-12-22 05:23

    It is a pivot table

    CREATE TABLE table1 (
      `id` INTEGER,
      `name` VARCHAR(5),
      `value` VARCHAR(3),
      `user_id` INTEGER
    );
    
    INSERT INTO table1
      (`id`, `name`, `value`, `user_id`)
    VALUES
      ('1', 'foo', '40', '10'),
      ('2', 'bar', '15', '10'),
      ('3', 'baz', '390', '10'),
      ('4', 'quux', 'ENG', '10'),
      ('5', 'waldo', '1', '10'),
      ('6', 'foo', '20', '13'),
      ('7', 'bar', '15', '13'),
      ('8', 'waldo', '1', '13'),
      ('9', 'baz', '0', '13'),
      ('10', 'quux', 'ENG', '13'),
      ('11', 'baz', '420', '15'),
      ('12', 'waldo', '1', '15'),
      ('13', 'bar', '1', '15'),
      ('14', 'foo', '5', '15'),
      ('15', 'quux', 'ENG', '15'),
      ('16', 'waldo', '1', '16'),
      ('17', 'quux', 'ENG', '16'),
      ('18', 'foo', '5', '16'),
      ('19', 'baz', '0', '16'),
      ('20', 'bar', '15', '16');
    
    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
                   CONCAT('MAX(IF(s.name = "', `name`,'", `value`,"")) AS ',name)
                  ) INTO @sql
    FROM table1;
    
    
    SET @sql = CONCAT('SELECT s.user_id,  ', @sql, ' 
                      FROM table1 s
                     GROUP BY s.user_id
                     ORDER BY s.user_id');
    SELECT @sql;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    
    
    user_id | bar | baz | foo | quux | waldo
    ------: | :-- | :-- | :-- | :--- | :----
         10 | 15  | 390 | 40  | ENG  | 1    
         13 | 15  | 0   | 20  | ENG  | 1    
         15 | 1   | 420 | 5   | ENG  | 1    
         16 | 15  | 0   | 5   | ENG  | 1    
    

    db<>fiddle here

提交回复
热议问题