使用增量记录创建基于 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.
我需要使用仅加载增量记录的数据库创建交叉表。请考虑以下示例,表 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.