SQL - 计算数字列数值的百分比增长

3
我希望基于我在SQL数据库中得到的值计算一些趋势。特别是,我有兴趣获取一列中值的增加百分比(如果值已经减少,则该值应为负数)。
请问有人能够建议我该如何做吗?
我不能使用存储过程。
谢谢。 我的表格有以下列 日期(数字),月份(数字),订单(数字),价格(实数)
我想计算接收到的订单数量从一个月到下一个月的变化百分比。我也希望方向成为考虑因素,即如果销售额减少,则返回的值应为负数。

请问有人能给些建议,我应该如何做这个吗?不过在此之前,需要一些关于你的模式的基本信息。 - kquinn
4个回答

3

我不确定SQLite是否允许使用变量,但以下是我在MySQL中的操作方式。我刚测试过,效果很好:当数字从10增加到20时,显示100%;当数字从46下降到40时,显示-13.04%。

希望在SQLite中也是类似的方法:

SELECT
  CONCAT(
    FORMAT(
      IF(@prev AND SUM(orders) <> @prev,
          -1 * 100 * (1 - SUM(orders) / @prev),
          0
        )
      , 2)
  , '%') AS variation,
    @prev := SUM(orders) AS orders
FROM
    (SELECT @prev := NULL) init,
    product
GROUP BY
  id_product
ORDER BY
  month

当然,您需要根据需要调整输出。目前该代码将百分比格式化为2位小数,并在末尾添加“%”符号。

1

如果您有一个整数列,其中包含年份+月份(YYYYMM),那么这将非常有用。

cast(
     cast(year(date) as nvarchar) + 
     replicate('0',2-len(cast(month(date) as nvarchar))) +
     cast(month(date) as nvarchar)
as int)

然后你只需要分组,获取先前的值并进行计算。

select yearmonth, 
       sum(t.orders), 
       (sum(t.orders)/(select top 1 sum(orders) 
                       from table 
                       where yearmonth<t.yearmonth 
                       group by yearmonth 
                       order by yearmonth desc)-1)*100. as pct 
from table t 
group by yearmonth

T-SQL语法,希望你能在SQLite中使用它

附注:必须进行除零检查以避免进一步的问题。


1

关于日期列我不确定,但如果每个月只有一行,则答案可能是(我没有sqlite,但我认为这个答案是ANSI sql):

select t.date
,      t.month
,      t.orders
,      case when t2.orders = 0 then
          99999.0
       else
          100.0 * (t.orders - t2.orders) / t2.orders
       end  "increase"
from   t
left join t t2 on t2.month = t.month - 1
order by t.month

1
为了计算趋势,您需要存储您感兴趣的值的历史数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接