首页 > 解决方案 > 使用日期将年销售额拆分为月销售额

问题描述

我对 SQL 很陌生,但希望你能在这个逻辑上帮助我。我需要帮助才能在 SQL Server(SQL Server Management Studio)中编写这个函数。我有一个发布日期,以及以年为单位的销售额。

目前我的数据如下所示:

销售表

项目名称 发射日期 销售 Y1 销售 Y2
项目一 2021-01-01 15000 25000
项目 2 2021-06-01 15000 25000
项目 3 2021-03-01 10000 60000
项目 4 2021-12-01 75000 70000

我想把它改成

预报

项目名称 销售月份 销售量
项目一 2021-01-01 1250
项目一 2021-02-01 1250
项目一 2021-03-01 1250
项目一 2021-04-01 1250
项目一 2021-05-01 1250
项目一 2021-06-01 1250
项目一 2021-07-01 1250
项目一 2021-08-01 1250
项目一 2021-09-01 1250
项目一 2021-10-01 1250
项目一 2021-11-01 1250
项目一 2021-12-01 1250
项目一 2022-01-01 2083
项目一 2021-03-01 2083
项目一 2021-04-01 2083
项目一 2021-05-01 2083
项目一 2021-01-01 2083
项目一 2021-02-01 2083
项目一 2021-03-01 2083
等等...

所以它所做的是将年度销售额(Sales Y1)分成 12 行,放在发布日期之后,而不是其他 12 行(Sales Y2),并将其他 12 行放在前 12 行之后。

这在 SQL 中可能吗?

标签: sqlsql-servertsqlforecast

解决方案


你可以试试这个:

with ydata as (
  select 'Project 1' as ProjectName, convert(date,'2021-01-01') as LaunchDate, 15000 as SalesY1,25000 as SalesY2 union all
  select 'Project 2','2021-06-01',15000,25000 union all
  select 'Project 3','2021-03-01',10000,60000 union all
  select 'Project 4','2021-12-01',75000,70000
),
mnt as (
  select 1 as n, convert(date,'20210101',112) as d
  union all
  select n + 1, dateadd(month,1,d)
  from mnt
  where n < 24
)
select 
  ProjectName, d as SalesMonth, 
  case 
    when year(d) = 2021 then SalesY1/12
    else SalesY2/12 
  end as Sales
from mnt m
  cross join ydata d
order by ProjectName, d

您可以在这个 db<>fiddle上进行测试


推荐阅读