Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL за създаване на матрична таблица

Трябва да използвате условно сумиране и динамичен SQL за това

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN l.Item = ',
      id,
      ' THEN l.qty END) `',
      name, '`'
    )
  ) INTO @sql
FROM ItemLIst;

SET @sql = CONCAT('SELECT u.name, ', @sql, ' 
                     FROM OrderList l JOIN UserList u
                       ON l.User = u.id
                    GROUP BY u.name');

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

Изход:

<пред>| ИМЕ | ЯБЪЛКА | ОРАНЖЕВО | БАНАН | КИВИ | МАНГО |------------------------------------------------ ------| Джеймс | (нула) | (нула) | (нула) | (нула) | 1 || Джон | (нула) | 2 | 3 | 1 | (нула) || Мери | 4 | 2 | (нула) | (нула) | (нула) |

Ето SQLPiddle демонстрация

Сега няма да можете да го увиете в изглед, но можете да го направите съхранена процедура.

DELIMITER $$
CREATE PROCEDURE sp_order_report()
BEGIN
  SET @sql = NULL;
  SELECT
    GROUP_CONCAT(DISTINCT
      CONCAT(
        'SUM(CASE WHEN l.Item = ',
        id,
        ' THEN l.qty END) `',
        name, '`'
      )
    ) INTO @sql
  FROM
    ItemLIst;
  SET @sql = CONCAT('SELECT u.name, ', @sql, ' 
                       FROM OrderList l JOIN UserList u
                         ON l.User = u.id
                      GROUP BY u.name');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
 

И го използвайте по следния начин:

CALL sp_order_report();
 

Ето SQLPiddle демонстрация




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извика процедура в kohana 3.1

  2. MySQL Alter table причинява грешка:Невалидно използване на NULL стойност

  3. mysqli_connect към отдалечен сървър

  4. mysql със стойности, разделени със запетая

  5. mysql КЪДЕ МАЧ СРЕЩУ