MySQL 使用 3 个表进行数据透视
MySQL pivot with 3 tables
我搜索并查看了有关 MySQL 中数据透视(动态)数据的各种帖子。我已经设法让它与一个 table 一起工作,但是当我尝试用三个 table 来做到这一点时,我遇到了障碍。有人能指出我正确的方向吗?
- Table 1:供应商(我们购买的供应商列表)
- Table 2:Criteria(每个Vendor设定的标准)
- Table 3: 矩阵 (A link table for
以上两个)
我想要实现的是这样的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;
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;
我搜索并查看了有关 MySQL 中数据透视(动态)数据的各种帖子。我已经设法让它与一个 table 一起工作,但是当我尝试用三个 table 来做到这一点时,我遇到了障碍。有人能指出我正确的方向吗?
- Table 1:供应商(我们购买的供应商列表)
- Table 2:Criteria(每个Vendor设定的标准)
- Table 3: 矩阵 (A link table for 以上两个)
我想要实现的是这样的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;
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;