MySQL 使用 3 个表进行数据透视

MySQL pivot with 3 tables

我搜索并查看了有关 MySQL 中数据透视(动态)数据的各种帖子。我已经设法让它与一个 table 一起工作,但是当我尝试用三个 table 来做到这一点时,我遇到了障碍。有人能指出我正确的方向吗?

我想要实现的是这样的matrix/pivot:

           Criteria1        Criteria2        Criteria3 
Vendor 1   ValueFromMatrix  ValueFromMatrix  ValueFromMatrix
Vendor 2   ValueFromMatrix  ValueFromMatrix  ValueFromMatrix
Vendor 3   ValueFromMatrix  ValueFromMatrix  ValueFromMatrix

这个 table 正在使用的例子:

           MinOrderQty        MinOrderValue        ReturnsAllowed 
Intel      1000                5000.00             RMA required
AMD        2000               15000.00             No
nVidia     9000                8000.00             RMA + dropship

供应商和标准的数量是动态的,可以由用户added/deleted,所以我不能硬编码从行到列的转换。

ValueFromMatrix 是一个 Varchar(200) 字段并包含文本。它是 link 通过使用 VendorID 和 CriteriaID (int) 字段对另外两个 table 进行编辑。

我只是在这里碰壁了,我没有运气破译我见过的一些例子。

Table代码:

CREATE TABLE `vendors` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


CREATE TABLE `criteria` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `criteria_desc` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


CREATE TABLE `matrix` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` int(11) DEFAULT NULL,
  `criteria_id` int(11) DEFAULT NULL,
  `criteria_response` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=latin1;

SQL Fiddle of DB schema/data

criteria_response 字段用于填充上述 table 示例中的 ValueFromMatrix。

如果有人能给我指出正确的方向,我将不胜感激。我只是没有看到任何讨论三个 table 来生成此视图的示例,而且我一直被卡住。

谢谢。

试试这个根据我之前的回答之一改编的查询(改编自 this question/answer):

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN criteria_id = ''',
      criteria_id,
      ''' THEN criteria_response END) AS `',
      criteria_desc, '`'
    )
  ) INTO @sql
FROM  matrix m JOIN criteria c ON m.criteria_id = c.id;

SET @sql = CONCAT('SELECT V.vendor_name, ', @sql, ' 
                  FROM matrix m
                  JOIN vendors v ON m.vendor_id = v.id
                  JOIN criteria c on m.criteria_id = c.id
                  GROUP BY v.id');

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

Sample SQL Fiddle