在SQL中计算每个部门迄今为止的月收入问题

问题描述

我这样查询一个数据帧:

Select 
Date,Department,cumu_revenue_yr,LAG(cumu_revenue_yr,1) OVER (
                PARTITION BY Department
                ORDER BY Date) as previous_cumu_revenue_yr,(cumu_revenue_yr - previous_cumu_revenue_yr) as 1day_revenue
from dmf_dbo.revenue

enter image description here

cumu_revenue_yr是从一年的第一天到今天的累计收入。

但是,如果我想再增加一列以显示从每个月初到现在(当前cumu_revenue_yr-前一个月底cumu_revenue_yr)的收入,我该怎么做?

我尝试做类似的事情:

Select 
Date,(cumu_revenue_yr - previous_cumu_revenue_yr) as 1day_revenue,Day(Date)) OVER (
                PARTITION BY Department
                ORDER BY Date) as previous_monthend_cumu_revenue,(cumu_revenue_yr - previous_monthend_cumu_revenue) as whole_month_revenue,from dmf_dbo.revenue

但是有两个问题:

  1. LAG()仅在第二个参数中接受正整数。
  2. 时间序列是营业日。换句话说,在周末或假日将没有数据记录。因此,使用LAG(cumu_revenue_yr,Day(Date))不能帮助我提取正确的数据。

有人有什么建议吗? 最终的数据帧应该看起来像

enter image description here

解决方法

这是2个查询。第一个查询是我认为如何返回第一组数据。第二个查询会添加每月的累计运行1day_revenue

/* Query */
Select [Date],Department,cumu_revenue_yr,(cumu_revenue_yr - LAG(cumu_revenue_yr,1) OVER (
                              PARTITION BY Department
                              ORDER BY Date)) as [1day_revenue]
from dmf_dbo.revenue;

[EDIT] LAG功能在CTE中运行。然后访问CTE以计算年,月分区的总和。

/* Query with SUM() OVER */
;with lag_cte([Date],[1day_revenue]) as (
    Select [Date],1) OVER (
                                  PARTITION BY Department
                                  ORDER BY Date))
    from dmf_dbo.revenue)
Select *,sum(cumu_revenue_yr-[1day_revenue]) over 
             (partition by year([Date]),month([Date])
              order by [Date]) as cumu_revenue_month
from lag_cte;
,

您可以为此使用apply

select r2.*,r.cumu_revenue_yr - coalesce(r2.cumu_revenue_yr,0) as mtd
from dmf_dbo.revenue r outer apply
     (select top (1) r2.*
      from dmf_dbo.revenue r2
      where r2.department = r.department and
            year(r2.date) = year(r.date) and
            r2.date < datefromparts(year(r.date),month(r.date),1)
      order by r2.date desc
     ) r2

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...