MySQL行转动态列的问题

我想根据图中的3张表创建一个视图,请问应该怎么写?

img

表结构及数据如下:


```sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `dict`;
CREATE TABLE `dict`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Catagory` int(1) DEFAULT NULL,
  `Desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `dict` VALUES (1, 0, '生产日期');
INSERT INTO `dict` VALUES (2, 1, '交货日期');

DROP TABLE IF EXISTS `product`;
CREATE TABLE `product`  (
  `ProductId` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `Size` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`ProductId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `product` VALUES (1, 'P1', '123*321');
INSERT INTO `product` VALUES (2, 'P2', '789*987');

DROP TABLE IF EXISTS `productdetails`;
CREATE TABLE `productdetails`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductId` int(11) DEFAULT NULL,
  `Catagory` int(1) DEFAULT NULL,
  `Start` datetime(0) DEFAULT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `productdetails` VALUES (1, 1, 0, '2023-03-27 13:37:01');
INSERT INTO `productdetails` VALUES (2, 1, 0, '2023-03-20 13:37:57');
INSERT INTO `productdetails` VALUES (3, 1, 0, '2023-03-18 13:38:19');
INSERT INTO `productdetails` VALUES (4, 2, 0, '2023-03-01 13:38:37');
INSERT INTO `productdetails` VALUES (5, 2, 0, '2023-03-06 13:38:54');
INSERT INTO `productdetails` VALUES (6, 1, 1, '2023-03-08 17:23:55');
INSERT INTO `productdetails` VALUES (7, 1, 1, '2023-03-09 17:24:18');
INSERT INTO `productdetails` VALUES (8, 2, 1, '2023-03-01 17:24:48');

SET FOREIGN_KEY_CHECKS = 1;

第n次生产,这个n是根据id来排的吗

第几次按"start"升序排列,我需要完整的代码,谢谢!

该回答引用ChatGPT
根据题目描述,需要将productdetails表中的Catagory列的值作为动态列,生成一个视图,该视图包含以下列:ProductId、ProductName、Size、生产日期、交货日期。
可以使用MySQL的动态列转行函数GROUP_CONCAT和CASE WHEN语句来实现。
以下是实现代码:

CREATE VIEW product_view AS
SELECT p.ProductId, p.ProductName, p.Size,
MAX(CASE WHEN d.Catagory = 0 THEN d.Start END) AS '生产日期',
MAX(CASE WHEN d.Catagory = 1 THEN d.Start END) AS '交货日期'
FROM product p
LEFT JOIN productdetails d ON p.ProductId = d.ProductId
GROUP BY p.ProductId;

解释一下代码:
首先创建一个名为product_view的视图。
然后使用SELECT语句查询需要的列,其中使用了MAX函数和CASE WHEN语句将Catagory列的值作为动态列转换成了静态列。
最后使用LEFT JOIN将product表和productdetails表连接起来,并使用GROUP BY将结果按照ProductId分组。
这样就可以得到一个包含ProductId、ProductName、Size、生产日期、交货日期的视图了。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以使用MySQL的PIVOT语句来实现行转列,创建视图的语句如下:

CREATE VIEW product_details_view AS 
SELECT ProductId, ProductName, Size, 
MAX(CASE WHEN Catagory = 0 AND `Desc` = '生产日期' THEN Start END) AS Product_Date,
MAX(CASE WHEN Catagory = 1 AND `Desc` = '交货日期' THEN Start END) AS Delivery_Date
FROM product 
JOIN productdetails ON product.ProductId = productdetails.ProductId 
JOIN dict ON productdetails.Catagory = dict.Catagory
GROUP BY ProductId;

这个视图将会屏蔽掉原来的表结构,建议在创建视图之前备份原来的表。
如果我的回答解决了您的问题,请采纳!