首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将本月销售额与上月销售额进行比较

将本月销售额与上月销售额进行比较
EN

Stack Overflow用户
提问于 2021-08-07 18:05:02
回答 2查看 290关注 0票数 1

获取测试数据的代码:

代码语言:javascript
运行
复制
create table SalesCalls
(
    EmpId INT NOT NULL,
    EmpName nvarchar(20),
    month INT,
    Year INT,
    CallsMade INT
)
GO

Insert into SalesCalls values
(1,'ABC',12,2018,10),
(1,'ABC',1,2019,15),
(1,'ABC',2,2019,20),
(2,'DEF',12,2018,12),
(2,'DEF',1,2019,14),
(2,'DEF',2,2019,26)
GO

目标是将员工的当月销售额与该员工上个月的销售额进行比较,并找出其中的百分比变化。使用以下查询实现了这一点:

代码语言:javascript
运行
复制
With SalesCTE as 
(
    select EmpId,EmpName,
        Month As CurrentMonth,
        Year as CurrentMonthYear,
        Case When month = 1 then 12 Else (Month-1) End AS PrevMonth,
        Case when month = 1 then (Year - 1) Else Year End As PrevMonthYear,
        CallsMade 
    from SalesCalls
)
select 
    S1.EmpId, S1.EmpName, S1.CurrentMonth, S1.CurrentMonthYear, S1.CallsMade as CurrentMonthCalls,
    S2.CurrentMonth as PrevMont,
    S2.CurrentMonthYear as PrevMonthYear,
    S2.CallsMade as PrevMonthCalls,
    ( CONVERT(numeric(5,2),S1.CallsMade) / S2.CallsMade) * 100 As PercentageChange
from SalesCTE S1
JOIN SalesCTE S2 ON S1.EmpId = S2.EmpId
    AND S1.PrevMonth = S2.CurrentMonth   
    AND S1.PrevMonthYear = S2.CurrentMonthYear
ORDER BY S1.EmpId, S1.CurrentMonth, S1.CurrentMonthYear

上面的查询一直有效,直到同一个月的员工没有多余的记录。

但是以后会出现来自多个来源的数据,一个Employee表可以有多个记录,并且该表仍然有效。因为员工可能会以不同的方式拨打电话。以as为例,将以下记录插入到表中:

代码语言:javascript
运行
复制
Insert into SalesCalls values
(1,'ABC',1,2019,1)

现在,上面的查询不再有效,上面的查询可以很好地比较当月SalesCalls和上个月。

用例的第二阶段:为了解决这个问题,我构建了一个包含聚合数据的中间临时表。使用的查询为:

代码语言:javascript
运行
复制
Select EmpId, EmpName, month, Year, SUM(CallsMade) as CallsMade 
into #SalesCalls
from SalesCalls
group by EmpId, EmpName, month, Year

现在,CTE中的SalesCalls表被替换为#SalesCalls,然后上面的查询就可以正常工作了。

但每次都需要删除并重新创建此#SalesCalls表,才能查看最新的比较数据。

问题是,是否可以仅使用单个查询而不使用中间临时表或视图来获取比较数据。

EN

Stack Overflow用户

发布于 2021-08-07 19:02:18

最简单的解决方案之一:

代码语言:javascript
运行
复制
select EmpId, EmpName, month, Year,
       sum(CallsMade) as CallsMade,
        lag(sum(callsMade)) over (partition by empId order by year, month) AS prevMonthCalls,
        sum(CallsMade) * 100.0 / lag(sum(CallsMade)) over (partition by empId order by year, month) as PercentageChange
from SalesCalls
group by EmpId, EmpName, month, Year
order by EmpId,  Year,month;
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68694933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档