Sql 找到销售月环比增长百分比的方法
我想使用SQL Server查找月销售额的百分比增长。我想通过使用自连接和使用具有无限行的分区来发现销售额的%MoM增长。我不想使用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,
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-我已经发布了格式化的代码/查询,此外,我还添加了图像,以显示我已经运行了代码及其给出的结果。我在这里相对较新,有什么理由我们不应该使用图像吗?只需谷歌搜索-其中一个帖子说-图像在帖子中很有用,但确保没有它们的帖子仍然清晰。如果您发布代码或错误消息的图像,请直接将实际代码或消息复制粘贴或键入到帖子中。我将看看如何将数据添加为格式化文本。让我们来看看。