1

将 SQL 查询写入 -
给定 - 不同公司的日级别销售数据
1) 为给定数据创建月级别、年初至今级别数据。
YTD-Year to Date
YTD(Mar) = Jan + Feb + Mar
2) 根据 Company 为步骤 1 中创建的数据创建总体级别。将其标记为“Industry”
例如: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
4

1 回答 1

0

从问题的声音看来,所问的似乎是层层总计的表达。

您的查询运行良好,并且除了行业总数之外,还可以满足所有要求。

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

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]))
于 2019-05-10T09:13:57.093 回答