在此存储过程中,让我们将其用作示例:
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
答案 0 :(得分:1)
好吧...在一点帮助下,我得以回答自己的问题。谢谢所有回答的人。
此答案已在MySQL 5.6.12和8.0.14中进行了测试。为了提出一个有效的存储过程,我修改了@GMB的答案。
这是我的工作代码:
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;