2016-08-04 96 views
0

我的表看起来像/减少一组数据:百分比增加一个MySQL表

|| 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 
+0

您能否显示一些示例数据和预期结果 – TheGameiswar

+0

MySQL是否执行该查询?!? – jarlh

+0

是的,它确实正确执行和生成每个表/每年的分组。 – CaseyJones

回答

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中表达式的求值顺序,所以不能安全地在多个表达式(带赋值)中使用变量。