mysql - SQL创建矩阵表

标签 mysql sql

我想在 MySQL 中创建一个由 3 个表生成的 View 。

请参阅下表。

我想做的就是创建一个 View ,使用 table:ItemList 的 col:name 作为新 View 的列的标签。

如何使用 SQL 实现此目的?

表:ItemList,这个变化太频繁了

+----+-------------+
| id | name        |
+----+-------------+
|  1 | Apple       |
|  2 | Orange      |
|  3 | Banana      |
|  4 | Kiwi        |
|  5 | Mango       |
+----+-------------+

表:UserList

+----+-------------+
| id | name        |
+----+-------------+
|  1 | John        |
|  2 | Mary        |
|  3 | James       |
+----+-------------+

表:OrderList

+----+------+------+-----+
| id | User | Item | qty |
+----+------+------+-----+
|  1 |    1 |    4 |   1 |
|  2 |    1 |    2 |   2 |
|  3 |    2 |    1 |   4 |
|  4 |    1 |    3 |   3 |
|  5 |    3 |    5 |   1 |
|  6 |    2 |    2 |   2 |
+----+------+------+-----+

我想要创建的 View

+-------+-------+--------+--------+------+-------+
| User  | Apple | Orange | Banana | Kiwi | Mango |
+-------+-------+--------+--------+------+-------+
| John  |       |      2 |      3 |    1 |       |
| Mary  |     4 |      2 |        |      |       |
| James |       |        |        |      |     1 |
+-------+-------+--------+--------+------+-------+

最佳答案

为此,您必须使用条件求和和动态 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;

输出:

|  NAME |  APPLE | ORANGE | BANANA |   KIWI |  MANGO |
------------------------------------------------------
| James | (null) | (null) | (null) | (null) |      1 |
|  John | (null) |      2 |      3 |      1 | (null) |
|  Mary |      4 |      2 | (null) | (null) | (null) |

Here is SQLFiddle demo

Now you won't be able to wrap it into a view, but you can make it a stored procedure.

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();

这里是SQLFiddle 演示

关于mysql - SQL创建矩阵表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010870/

相关文章:

php - 将动态列添加到 MySQL 结果

mysql - 使用 * Like 运算符在 sql 查询中搜索表的所有列

php - 在 PHP 中使用 PDO 打开的 SQL 连接是否必须关闭

sql - SQL查找彼此在1分钟内发生的重复记录

mysql - 如何为我的网站帖子实现查看系统?

sql - 查询在sql中按行排序

mysql - "Foreign key constraint is incorrectly formed"

mysql - MySQL 中的自定义函数

php - localhost 是,但 phpmyadmin 空白

SQL创建空数据库