sql—查找销售增长百分比的方法

ffdz8vbo  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(459)

我想用SQLServer找出月销售额的增长百分比。我想通过使用self-join和前面的行没有边界的分区来找到销售增长的百分比。我不想使用 lag() . 有谁能告诉我生成这个解决方案的方法吗。
这是我的table。

create table growth_new(slno bigint,mon varchar(30),sales_amount bigint)

insert into growth_new values(1, 'Jan', 5000)
insert into growth_new values(2, 'Feb', 12000)
insert into growth_new values(3, 'Mar', 32000)
insert into growth_new values(4, 'Apr', 20000)

Slno Mon sales_amount
1    Jan    5000
2    Feb    12000
3    Mar    32000
4    Apr    20000
rjzwgtxy

rjzwgtxy1#

你可以用 lag() . 如果 slno 对行进行排序,然后:

select gn.*,
       (gn.sales_amount * 1.0 / lag(gn.sales_amount) over (order by slno)) - 1 as increase
from growth_new gn;

对于这个问题,自联接实际上没有意义。但如果确实需要使用此数据结构:

with gn as (
      select gn.*, convert(date, month + ' 2000') as mm
      from growth_new
     )
select gn.*,
       (gn.sales_amount * 1.0 / gnprev.sales_amount) - 1
from gn left join
     gn gnprev
     on gnprev.mm = dateadd(month, -1, gn.mm);

但是,您应该真正修复数据,以便 month 格式合理。

rdrgkggo

rdrgkggo2#

如果你不想使用 LEAD 或者 LAG ,可以使用以下选项:
我假设您可以使用id进行比较,否则,您可以有一个表来存储月份id

selecT g.*, growth = 100*cast(iif(p.sales_amount is null,0,(g.sales_amount-p.sales_amount)*1.0/p.sales_amount) as money)
from growth_new g
left join growth_new p on p.slno=g.slno-1

输出为:

slno    mon     sales_amount    growth
1        Jan    5000             0.00
2        Feb    12000            140.00
3        Mar    32000            166.67
4        Apr    20000            -37.50

希望这对你有帮助

wnavrhmk

wnavrhmk3#

除非你想尝试其他方法,否则你真的可以使用lag函数。同样如上所述,你的月格式是不理想的,不可扩展的。

WITH growth_new(slno ,mon ,sales_amount)
AS (SELECT 1, 'Jan', 5000  UNION 
    SELECT 2, 'Feb', 12000 UNION
    SELECT 3, 'Mar', 32000 UNION
    SELECT 4, 'Apr', 20000 
   )

 SELECT cur.*, prev.mon as prev_month, 
 ISNULL(prev.sales_amount,0) AS prev_month_sales_amount,
 [%MoM Change] = ((cur.sales_amount - 
 ISNULL(prev.sales_amount,0))/CAST(prev.sales_amount as float))*100
 FROM growth_new cur
 LEFT JOIN growth_new prev ON prev.slno = cur.slno - 1

 slno   mon sales_amount    prev_month  prev_month_sales_amount %MoM Change
  1     Jan   5000            NULL               0                 NULL
  2     Feb   12000           Jan             5000                 140
  3     Mar   32000           Feb             12000          166.666666666667
  4     Apr   20000           Mar             32000               -37.5

相关问题