查询生成月份级别和 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]))
将 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]))