【问题标题】:MySQL Totals By Year Column and MonthsMySQL 按年份列和月份汇总
【发布时间】:2014-11-10 03:27:45
【问题描述】:

寻找有关如何最好地提取一些数据的建议。我需要做一些计算,但要按年和月提取数据来制作这样的表格。如果有办法让范围自动生成年份,那就更好了。

2012 2013 2014 一月 $243 $567 $890 二月 $123 $456 $908 三月…… 四月 可能

我可以按年、月对数据进行排序,但如您所知,如果没有一些中间件存储和遍历找到的集合,这并不容易将其放入 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')

【问题讨论】:

  • 您正在描述一个数据透视表。这在 MySQL 中是非常重要的,而且通常在生成 HTML 表的任何事情中都做得更好。

标签: mysql sql-order-by


【解决方案1】:

首先,在客户端执行此操作要容易得多。

但如果出于某种原因您仍想在数据库端对数据进行透视,则可以利用动态 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;

输出:

|月 | 2012 | 2013 | 2014 | |-----------|--------|--------|--------| |一月 | 243 |第567章890 | |二月 | 123 |第456章908 | |三月 | (空) | (空) | (空) | ...

这是一个SQLFiddle演示

【讨论】:

  • @jquery-junkie 有什么帮助吗?
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
相关资源
最近更新 更多