如何将我在MySQL存储过程中的输入作为列标题?

时间:2019-02-19 21:41:50

标签: mysql

在此存储过程中,让我们将其用作示例:

  • varReportYear1 = '2018'
  • varReportYear2 = '2019'

我希望那两年成为此数据透视表中的列标题。 在SELECT中,您可以看到我已经添加了AS '2018'AS '2019',但理想情况下,它们将等于输入值。

非常感谢您的帮助-谢谢!。

CREATE DEFINER=`me`@`%` PROCEDURE `spPivotReport`(
    in varReportYear1 char(4),
    in varReportYear2 char(4)
)
BEGIN
/*
* I want to have the values for 
* varReportYear1 and varReportYear2
* set as column headers
* in this pivot table.
*/

SELECT 
    `query_for_pivot`.`school` AS varschool,
    COUNT(IF((`query_for_pivot`.`year_of_request` = varReportYear1),
        `query_for_pivot`.`request_id`,
        NULL)) AS '2018',
    COUNT(IF((`query_for_pivot`.`year_of_request` = varReportYear2),
        `query_for_pivot`.`request_id`,
        NULL)) AS '2019'
FROM
    `query_for_pivot`
WHERE
    `query_for_pivot`.`year_of_request` = varReportYear1
        OR `query_for_pivot`.`year_of_request` = varReportYear2
GROUP BY `query_for_pivot`.`school`
ORDER BY `query_for_pivot`.`school`
;
END

2 个答案:

答案 0 :(得分:1)

好吧...在一点帮助下,我得以回答自己的问题。谢谢所有回答的人。

此答案已在MySQL 5.6.12和8.0.14中进行了测试。为了提出一个有效的存储过程,我修改了@GMB的答案。

我从GMB的sp中更改了什么? (请参见下文)

  1. 对于列标题,我必须将 yr _ 连接到变量值。它不喜欢仅数字的列标题(在我的示例中为varReportYear1 ='2018',varReportYear2 ='2019')。
  2. 我必须在变量周围加上单引号。

这是我的工作代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `spPivotReportPrepared`(
in varReportYear1 char(4),
in varReportYear2 char(4)
)
BEGIN

    SET @sql = CONCAT(
    'SELECT 
        `query_for_pivot`.`school` AS varschool,
        COUNT(IF((`query_for_pivot`.`year_of_request` = ',varReportYear1,'),
            `query_for_pivot`.`request_id`,
            NULL)) AS yr_',varReportYear1, ',
        COUNT(IF((`query_for_pivot`.`year_of_request` = ',varReportYear2,'),
            `query_for_pivot`.`request_id`,
            NULL)) AS yr_',varReportYear2,'
    FROM
        `query_for_pivot`
    WHERE
        `query_for_pivot`.`year_of_request` = ',varReportYear1,'
            OR `query_for_pivot`.`year_of_request` = ',varReportYear2,'
    GROUP BY `query_for_pivot`.`school`
    ORDER BY `query_for_pivot`.`school`');


    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

答案 1 :(得分:0)

您可以使用准备好的语句。见下文

CREATE DEFINER=`me`@`%` PROCEDURE `spPivotReport`(
    in varReportYear1 char(4),
    in varReportYear2 char(4)
)
BEGIN
   PREPARE stmt1 FROM 'SELECT 
        `query_for_pivot`.`school` AS varschool,
        COUNT(IF((`query_for_pivot`.`year_of_request` = ?),
            `query_for_pivot`.`request_id`,
            NULL)) AS ?,
        COUNT(IF((`query_for_pivot`.`year_of_request` = ?),
            `query_for_pivot`.`request_id`,
            NULL)) AS ?
    FROM
        `query_for_pivot`
    WHERE
        `query_for_pivot`.`year_of_request` = ?
            OR `query_for_pivot`.`year_of_request` = ?
    GROUP BY `query_for_pivot`.`school`
    ORDER BY `query_for_pivot`.`school`';

    EXECUTE stmt1 USING 
      varReportYear1 , 
      varReportYear1, 
      varReportYear2,
      varReportYear2,
      varReportYear1,
      varReportYear2 ;
    DEALLOCATE PREPARE stmt1;
END;