繁体   English   中英

MySQL存储过程或动态视图

[英]MySQL stored procedure or dynamic view

我有以下准备好的语句来在三个表之间运行动态数据透视查询

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;

产生像这样的数据集:

+-----------------+-----------------+------------+------------+--------------+------------+------------+-------+
| PBL             | PLI             | PMI        | PBT        | PBP          | PBI        | PBTL       | PRDT  |
+-----------------+-----------------+------------+------------+--------------+------------+------------+-------+
| Sales           | Human Resources | Production | Purchasing | Sales        | Purchasing | Purchasing | Sales |
| Human Resources | Purchasing      | NULL       | NULL       | Purchasing   | NULL       | NULL       | NULL  |
| Purchasing      | Finance         | NULL       | NULL       | Distribution | NULL       | NULL       | NULL  |
| Distribution    | NULL            | NULL       | NULL       | Production   | NULL       | NULL       | NULL  |
| Production      | NULL            | NULL       | NULL       | NULL         | NULL       | NULL       | NULL  |
| Finance         | NULL            | NULL       | NULL       | NULL         | NULL       | NULL       | NULL  |
+-----------------+-----------------+------------+------------+--------------+------------+------------+-------+

我希望生成的数据集可用于导入Excel,但是当我尝试运行完整语句时,MS Query会抛出错误。 我相信我无法从准备好的语句创建视图,因此如何在不每次都重新键入(复制并粘贴)查询结果并将其从MySQL中获取的情况下获得可用的查询结果。

谢谢!

我相信我无法从准备好的语句创建视图,因此如何在不重新输入(复制并粘贴)的情况下获得查询结果

您可以使用“准备查询”创建view

尝试在代码中进行以下更改:

-- 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_name发出select * from view_name以将数据提取到客户端。

演示 @ MySQL 5.5.32 Fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM