使用增量记录创建基于 SQL 查询的每日报告

Create a SQL query based Daily report with Incremental Records

我需要使用仅加载增量记录的数据库创建交叉表。请考虑以下示例,表 1:

DAY         ACCOUNT NO  SALES   GENDER
1-Apr-2019  ACC01       5000    MALE
1-Apr-2019  ACC02       6000    FEMALE
1-Apr-2019  ACC03       7000    FEMALE
1-Apr-2019  ACC04       8000    MALE
2-Apr-2019  ACC01       7500    MALE
2-Apr-2019  ACC02       4000    FEMALE
2-Apr-2019  ACC03       10000   FEMALE
2-Apr-2019  ACC04       20000   MALE
3-Apr-2019  ACC01       8500    FEMALE
3-Apr-2019  ACC05       3500    FEMALE
4-Apr-2019  ACC02       9500    FEMALE
4-Apr-2019  ACC06       3600    FEMALE
4-Apr-2019  ACC07       4800    MALE
5-Apr-2019  ACC01       15000   FEMALE
5-Apr-2019  ACC03       12500   FEMALE

表 1 条目解释如下:

4 月 1 日,有 4 个帐户及其销售编号和帐户持有人的性别。
4月2日,所有账号的sale nos都有些变化,所以都加载了。
但是在 4 月 3 日,我们只加载增量帐户。可以看出,只有 ACC01 的销售额发生了变化,并且还有一个新帐户 ACC05。因此只会加载这 2 个帐户。
同样在 4 月 4 日,现有账户 ACC02 的销售额比之前的值有所增加,因此它被加载。与此同时,还有 2 个新帐户 ACC06 和 ACC07 也被加载。
最后,在 4 月 5 日,我们加载现有账户,这些账户的销售编号与其上一个值相比发生了变化。

现在,我必须做一个每日 MIS 报告,结果应该如下,考虑到我的所有账户在 2019 年 4 月 5 日都是活跃的。

NO OF ACCOUNTS 实际上是每天结束时活跃帐户的数量。

上面的报表 1 列表,我能够在 Report Studio 中使用 Cognos Query/SQL 项使用以下子查询实现:

SELECT  DISTINCT D1.DAY, (SELECT COUNT(DISTINCT D2.ACCN_NO) FROM
DAILY_TABLE D2 WHERE D2.DAY <= D1.DAY) AS NO_OF_ACCOUNTS FROM
DAILY_TABLE D1 GROUP BY D1.DAY

现在,我的要求是生成以下交叉表,并在性别上进行切割。

此致

您可以通过自联接轻松拆分总数,但我不明白 no of accounts 是如何设置的。你将不得不更好地解释。

要拆分销售额,您可以使用此方法

declare @sales table (salesday date, account varchar(5), sales int, gender varchar(10))

insert into @sales (salesday, account, sales, gender)
values ('20190401', 'ACC01', 5000, 'MALE'),
       ('20190401', 'ACC02', 6000, 'FEMALE'),
       ('20190401', 'ACC03', 7000, 'FEMALE'),
       ('20190401', 'ACC04', 8000, 'MALE'),
       ('20190402', 'ACC01', 7500, 'MALE'),
       ('20190402', 'ACC02', 4000, 'FEMALE'),
       ('20190402', 'ACC03', 10000, 'FEMALE'),
       ('20190402', 'ACC04', 20000, 'MALE'),
       ('20190403', 'ACC01', 8500, 'FEMALE'),
       ('20190403', 'ACC05', 3500, 'FEMALE'),
       ('20190404', 'ACC02', 9500, 'FEMALE'),
       ('20190404', 'ACC06', 3600, 'FEMALE'),
       ('20190404', 'ACC07', 4800, 'MALE'),
       ('20190405', 'ACC01', 15000, 'FEMALE'),
       ('20190405', 'ACC03', 12500, 'FEMALE')

select s.salesday,
       sum(sm.sales) as sales_male,
       sum(sf.sales) as sales_female
from   @sales s
  left join @sales sm on s.salesday = sm.salesday
                     and s.account = sm.account
                     and sm.gender = 'MALE'
  left join @sales sf on s.salesday = sf.salesday
                     and s.account = sf.account
                     and sf.gender = 'FEMALE'
group by s.salesday
order by 1

结果会是

salesday    sales_male  sales_female    
--------    ----------  ------------    
2019-04-01  13000       13000   
2019-04-02  27500       14000   
2019-04-03  null        12000   
2019-04-04  4800        13100   
2019-04-05  null        27500   

只需使用累计和。以下生成男性和女性的所有每日和累积值:

select salesday, count(*) as daily_cnt, sum(sales) as daily_sales,
       sum(case when gender = 'MALE' then 1 else 0 end) as daily_male_cnt,
       sum(case when gender = 'MALE' then sales else 0 end) as daily_male_sales,
       sum(case when gender = 'FEMALE' then 1 else 0 end) as daily_female_cnt,
       sum(case when gender = 'FEMALE' then sales else 0 end) as daily_female_sales,
       sum(count(*)) over (order by salesday) as cumulative_count,
       sum(sum(sales)) over (order by salesday) as cumulative_sales,
       sum(sum(case when gender = 'MALE' then 1 else 0 end)) over (order by salesday) as cumulative_male_cnt,
       sum(sum(case when gender = 'MALE' then sales else 0 end)) over (order by salesday) as cumulative_male_sales,
       sum(sum(case when gender = 'FEMALE' then 1 else 0 end)) over (order by salesday) as cumulative_female_cnt,
       sum(sum(case when gender = 'FEMALE' then sales else 0 end)) over (order by salesday) as cumulative_female_sales
from @sales s
group by salesday;

您可以选择您真正想要的列。

Here 是一个 db<>fiddle.