Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找到销售月环比增长百分比的方法_Sql_Sql Server_Self Join - Fatal编程技术网

Sql 找到销售月环比增长百分比的方法

Sql 找到销售月环比增长百分比的方法,sql,sql-server,self-join,Sql,Sql Server,Self Join,我想使用SQL Server查找月销售额的百分比增长。我想通过使用自连接和使用具有无限行的分区来发现销售额的%MoM增长。我不想使用lag()。有人能告诉我生成此解决方案的方法吗 这是我的桌子 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,

我想使用SQL Server查找月销售额的百分比增长。我想通过使用自连接和使用具有无限行的分区来发现销售额的%MoM增长。我不想使用
lag()
。有人能告诉我生成此解决方案的方法吗

这是我的桌子

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
您可以使用
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);

但是,您应该真正修复数据,使
月份
的格式合理。

如果您不想使用
领先
滞后
,可以使用以下方法:

我假设您可以使用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

希望这能帮助您

除非您想尝试其他选择,否则您可以真正使用滞后功能。同样如上所述,您的月份格式并不理想,根本无法扩展

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

你试过什么?你在哪里卡住了?使用
lag
有什么问题?请向我们展示您期望的
lag
(或
LEAD
)结果正是您想要的。它将比自联接性能更好。您真的将日期存储为缩写的月份名称吗?这使得这里的事情变得更加复杂。@DaleK-我已经发布了格式化的代码/查询,此外,我还添加了图像,以显示我已经运行了代码及其给出的结果。我在这里相对较新,有什么理由我们不应该使用图像吗?只需谷歌搜索-其中一个帖子说-图像在帖子中很有用,但确保没有它们的帖子仍然清晰。如果您发布代码或错误消息的图像,请直接将实际代码或消息复制粘贴或键入到帖子中。我将看看如何将数据添加为格式化文本。让我们来看看。