寻找有关如何最好地提取某些数据的建议。我需要做一些计算,但是按年和月拉数据来制作这样的表格。如果有一种方法可以让范围自动生成年份,那就更好了。
2012 2013 2014 Jan $243 $567 $890 Feb $123 $456 $908 Mar ... ... Apr May
我可以按年,月份来获取数据,但是如您所知,如果没有一些中间件存储并迭代找到的集合,则不容易将其放入HTML表中。
我使用了以下查询,但该查询很接近但不准确。
select year(date_donated) as year, monthname(date_donated) as month, sum(amount_donated) as total_donations, count(date_donated) as count_donations from my_donations where (date_donated between "2012-01-01" and "2014-12-31") group by year(date_donated), month(date_donated) order by field(month, 'January','February','March','April','May','June','July','August','September','October','November','December')
答案 0 :(得分:0)
首先,在客户端执行此操作要容易得多。
但是如果由于某种原因你还想在数据库端转移数据,你可以利用动态SQL。
如果您希望连续几年和几个月不管数据如何,您还需要某种计数(数字)表。例如。喜欢这个
CREATE VIEW tally AS
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11;
现在是动态SQL部分:
SET @sql = NULL;
SELECT GROUP_CONCAT(CONCAT('SUM(CASE WHEN YEAR(date_donated) = ', year_start + n, ' THEN amount_donated END) `', year_start + n, '`'))
INTO @sql
FROM tally CROSS JOIN (SELECT 2012 year_start, 2014 year_end) y
WHERE n <= year_end - year_start
ORDER BY n;
SET @sql = CONCAT('SELECT MONTHNAME(''2000-01-01'' + INTERVAL n MONTH) month,', @sql,
' FROM tally t LEFT JOIN
(
SELECT date_donated, amount_donated
FROM my_donations
WHERE date_donated BETWEEN ''', 2012, '-01-01'' AND ''', 2014, '-12-31''
) d
ON t.n + 1 = MONTH(date_donated)
GROUP BY t.n
ORDER BY t.n');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
输出:
| MONTH | 2012 | 2013 | 2014 | |-----------|--------|--------|--------| | January | 243 | 567 | 890 | | February | 123 | 456 | 908 | | March | (null) | (null) | (null) | ...
这是 SQLFiddle 演示