mysql表中一组数据的增加/减少百分比

时间:2016-08-04 09:51:42

标签: mysql sql

我的表格如下:

|| date || bytes || table ||

我需要根据大小和年份计算出所有表格的年增长率(增加或减少百分比)。我有一个查询,它主要给我我想要的信息,我可以解析并使用外部工具来生成所需的数据,但我想知道是否有一种简单的方法直接在查询中执行百分比增加计算?

这就是我的查询现在的样子:

SELECT
    YEAR(date) AS YEAR,
    table,
    SUM(bytes) / 1024 / 1024 / 1024 AS total
FROM
    insertions
GROUP BY table, YEAR (date)
ORDER BY    date;

是否可能有一个字段的当前表相对于上一年的百分比增加/减少?

示例输出:

| date | bytes | table      | 
| 2015 | 100   | accounting |
| 2016 | 150   | accounting |
| 2015 | 1     | it         |
| 2016 | 100   | it         |

随着百分比的增加,它应该看起来像:

| date | bytes | table      | percentage 
| 2015 | 100   | accounting | 0
| 2016 | 150   | accounting | 50
| 2015 | 1     | it         | 0
| 2016 | 100   | it         | 9900

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用变量来获取先前的值:

  SELECT year, table, total,
         (@prev := (case when (@new_prev := @prev) = null
                         then 'never go here'
                         when @t = table
                         then if(@prev := total, @new_prev, @new_prev)
                         when @t := table
                         then if(@prev := total, NULL, NULL)
                    end)
         ) as prev_total
  FROM (SELECT YEAR(date) AS YEAR, table, SUM(bytes) / 1024 / 1024 / 1024 AS total
        FROM insertions i
        GROUP BY table, YEAR (date)
       ) yt CROSS JOIN
       (SELECT @t := '', @prev := -1) params
  ORDER BY table, date

其余的只是算术使用子查询来获得差异。

注意:这尤其具有挑战性,因为所有使用变量的公式都必须在单个表达式中。 MySQL不保证SELECT中表达式的评估顺序,因此您无法安全地在多个表达式中使用变量(带有赋值)。