查询生成月级和年初至今的数据

时间:2019-05-10 07:45:17

标签: sql-server tsql partition-by

将SQL查询写入-
给定-不同公司的日级销售数据
1)为给定数据创建月份级别,年初至今级别数据。
    年初至今-至今
    年初至今(3月)= 1月+ 2月+3月
2)根据公司为步骤1中创建的数据创建总体级别。将其标记为“行业”
    例如:行业= CompA + CompB + CompC + CompD
3)计算步骤2之后创建的数据的月份和年初至今的水平份额(值,数量)。
    份额计算-公司/行业。

我知道我们可以在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

1 个答案:

答案 0 :(得分: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]))