查询生成月份级别和 YTD 级别数据

Query for generating month level & YTD level data

将 SQL 查询写入 -
给定 - 不同公司的日级销售数据
1) 为给定数据创建月份级别、年初至今级别数据。
YTD-年初至今
YTD(三月)=一月 + 二月 +三月
2)在第一步创建的数据Company的基础上创建Overall level,标记为"Industry"
例如:行业 = CompA + CompB + CompC + CompD
3) 计算第 2 步后创建的数据的月份和 YTD 水平份额(包括价值、数量)。
份额计算 - 比较/行业。

我知道我们可以在 over 子句中使用 partition by,但总的来说我不明白这个问题。

schema:

[Period] - date
[Company]- nvarchar
[Metric] - nvarchar
[Values] - Float

Period      Company Metric           Values

01-01-2018  CompA   Sales Vol   72947.30664

02-01-2018  CompA   Sales Vol   21553.65941

03-01-2018  CompA   Sales Vol   777.6831962

04-01-2018  CompA   Sales Vol   34871.11234

05-01-2018  CompA   Sales Vol   42598.06526

我尝试按月和年使用分区。但我不清楚这是否符合预期。

 SELECT YEAR([Period]) AS Year,
        MONTH([Period]) as month,
        MTD  = SUM([Values]) OVER (PARTITION BY year([period]),month([period]) order by period),
        YTD  = SUM([Values]) OVER (PARTITION BY Year([period]) order by period)
        FROM  DP

从题目的声音看,好像问的是层层总数的表达。

您的查询运行良好,并且完成了除行业总计之外的所有要求。

下面的查询使用 "rollup",它允许您根据从左到右的 运行 列生成分层分组。因此,您将获得所有行业的总计、每家公司所有年份的总计以及每家公司每年所有月份的总计。

declare @sales table

(
    [Period] date,
    [Company] nvarchar(50),
    [Metric] nvarchar(50),
    [Values] float
);

insert @sales ([Period], [Company], [Metric], [Values])
values
('01-01-2018',  'CompA',   'Sales Vol',   72947.30664),
('02-01-2018',  'CompA',   'Sales Vol',   21553.65941),
('03-01-2018',  'CompA',   'Sales Vol',   777.6831962),
('04-01-2018',  'CompA',   'Sales Vol',   34871.11234),
('05-01-2018',  'CompA',   'Sales Vol',   42598.06526);

SELECT coalesce(Company,'Industry') as Company, coalesce(cast(YEAR([Period]) as nvarchar(50)), 'All Years') AS Year,
        coalesce(cast(MONTH([Period])as nvarchar(50)),'All Months') as month, coalesce(sum([values]),0) as sales
        FROM  @sales
        group by rollup (company, year([period]), month([period]))