【问题标题】:MySQL stored procedure or dynamic viewMySQL 存储过程或动态视图
【发布时间】:2014-04-30 13:24:05
【问题描述】:

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

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 中获取结果。

谢谢!

【问题讨论】:

    标签: mysql excel stored-procedures views prepared-statement


    【解决方案1】:

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

    您可以使用准备好的查询创建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 将数据提取到客户端。

    演示@MySQL 5.5.32 Fiddle

    【讨论】:

    • 但是视图的选择查询包含一个不允许的子查询是 MySQL。此外,我准备好的语句的开头部分是动态构建透视结果中列名的案例,我也认为这在视图中是不允许的。
    • 好的。您最好使用您拥有的代码和客户端应用程序中的call sp 创建一个存储过程。
    猜你喜欢
    • 2010-10-15
    • 2014-09-23
    • 1970-01-01
    • 2014-10-09
    • 2011-02-27
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多