MySQL存储过程或动态视图
我准备了以下语句来跨三个表运行动态透视查询MySQL存储过程或动态视图,mysql,excel,stored-procedures,views,prepared-statement,Mysql,Excel,Stored Procedures,Views,Prepared Statement,我准备了以下语句来跨三个表运行动态透视查询 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when division_id = ', dp.division_id, ' then process_name end) AS ', d.division_shortName, ' ' ) ) INTO @sql FROM erp_divisionProcess dp LEFT JOIN erp_
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT(
'max(case when division_id = ', dp.division_id, ' then process_name end) AS ', d.division_shortName, ' '
)
) INTO @sql
FROM
erp_divisionProcess dp LEFT JOIN erp_division d ON d.division_id = dp.division_id;
SET @sql = concat('SELECT ', @sql, 'FROM (
SELECT d.division_id, p.process_name, X.rnk
FROM erp_division d
LEFT JOIN (SELECT dp.division_id, dp.process_id, (SELECT COUNT(*) FROM erp_divisionProcess A WHERE dp.division_id = A.division_id AND dp.process_id < A.process_id) AS rnk
FROM erp_divisionProcess dp) X ON X.division_id = d.division_id
LEFT JOIN erp_BusinessProcess p ON p.process_id = X.process_id
) x
GROUP BY rnk');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我希望生成的数据集可以拉入Excel,但当我尝试运行完整语句时,MS Query抛出并出错。我相信我不能从准备好的语句中创建视图,所以我如何能够在不必每次重新键入copy并粘贴它并从MySQL中获取结果的情况下获得查询结果呢
谢谢
我相信我无法从准备好的语句中创建视图,那么如何在不必重新键入copy和paste的情况下使查询结果可用呢
可以使用准备好的查询创建视图
请尝试对代码进行以下更改:
-- SET @sql = concat('SELECT ', @sql, 'FROM (
SET @sql = concat( 'CREATE VIEW view_name AS SELECT ', @sql, ' FROM (
SELECT d.division_id, p.process_name, X.rnk
FROM erp_division d
LEFT JOIN (SELECT dp.division_id, dp.process_id,
(SELECT COUNT(*) FROM erp_divisionProcess A
WHERE dp.division_id = A.division_id
AND dp.process_id < A.process_id) AS rnk
FROM erp_divisionProcess dp) X
ON X.division_id = d.division_id
LEFT JOIN erp_BusinessProcess p ON p.process_id = X.process_id
) Y
GROUP BY rnk');
创建视图后,可以发出select*from view_名称将数据提取到客户端
Demo@但是该视图的select查询包含一个子查询,而MySQL是不允许的。另外,我准备好的语句的开始部分是动态地为数据透视结果中的列名构建案例,我也认为这在视图中是不允许的。Ok。您最好使用现有代码创建一个存储过程,并从客户端应用程序调用sp。
-- SET @sql = concat('SELECT ', @sql, 'FROM (
SET @sql = concat( 'CREATE VIEW view_name AS SELECT ', @sql, ' FROM (
SELECT d.division_id, p.process_name, X.rnk
FROM erp_division d
LEFT JOIN (SELECT dp.division_id, dp.process_id,
(SELECT COUNT(*) FROM erp_divisionProcess A
WHERE dp.division_id = A.division_id
AND dp.process_id < A.process_id) AS rnk
FROM erp_divisionProcess dp) X
ON X.division_id = d.division_id
LEFT JOIN erp_BusinessProcess p ON p.process_id = X.process_id
) Y
GROUP BY rnk');