mysql现有一个存储过程, `annual_project_month_hours_estimate`(IN in_project varchar(45),IN in_year varchar(10))通过输入项目名和年份,如何实现从一个仅有项目名、年月、数值三个字段的表a按项目和年月汇总从存在的最小到最大年月之间的透视表。
时间: 2024-02-24 11:59:06 浏览: 63
首先,您需要创建一个临时表,其中包含从表a中存在的最小到最大年月之间的所有年月。可以使用以下查询来创建临时表:
```
CREATE TEMPORARY TABLE temp_months AS
SELECT DISTINCT CONCAT(in_year, '-', LPAD(month, 2, '0')) AS year_month
FROM (
SELECT YEAR(date) AS in_year, MONTH(date) AS month
FROM a
WHERE project = in_project
AND YEAR(date) BETWEEN YEAR(CONCAT(in_year, '-01-01')) AND YEAR(NOW())
) t
ORDER BY year_month;
```
接下来,您可以使用以下查询来创建透视表:
```
SELECT
t.year_month,
IFNULL(SUM(CASE WHEN a.date = t.year_month THEN a.value END), 0) AS value
FROM temp_months t
LEFT JOIN a ON t.year_month = CONCAT(YEAR(a.date), '-', LPAD(MONTH(a.date), 2, '0'))
WHERE a.project = in_project
GROUP BY t.year_month
ORDER BY t.year_month;
```
在这个查询中,我们使用LEFT JOIN将临时表与表a连接起来,以便我们可以获得每个月的值。我们使用IFNULL函数来处理没有值的月份,并使用SUM函数来计算每个月的总和。最后,我们按年月排序结果。
阅读全文