我想根据我在SQL数据库中获得的值来计算一些趋势。特别是我感兴趣的是在一列中增加值的百分比增加(如果值减少,则值应为负值)
有人可以建议我该怎么做吗?
我无法使用存储过程。
感谢。
我的表格包含以下列
日期(数字),月份(数字),订单(数字),价格(真实)
我想计算从一个月到下一个月收到的订单数量的变化百分比。我也希望方向是一个考虑因素,即如果销售额下降,返回的价值应该是-ve。
答案 0 :(得分:3)
我不确定sqllite是否允许变量,但这是我在MySQL中的方式。我刚刚测试了它并且像魅力一样工作:100%打印增加10到20,-13.04%打印减少46到40。
希望它在sqllite中类似:
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 :(得分:1)
为了计算趋势,您需要存储您感兴趣的值的历史数据。
答案 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中使用
PS:必须进行零检查以避免进一步的问题。
答案 3 :(得分:1)
不确定列Date,但如果每月只有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