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

使用增量记录创建基于SQL查询的每日报告,sql,sql-server,database,cognos-10,Sql,Sql Server,Database,Cognos 10,我需要使用只加载增量记录的数据库创建交叉表。请考虑以下样本,表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 7

我需要使用只加载增量记录的数据库创建交叉表。请考虑以下样本,表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日,所有账户的销售编号都发生了一些变化,因此这些账户都已加载。 但在4月3日,我们只加载增量帐户。可以看出,只有ACC01的销售额发生了变化,而且还有一个新账户ACC05。因此,仅加载这2个帐户。 同样在4月4日,现有账户ACC02的销售额比以前的价值增加,因此它被加载。除此之外,还有两个新帐户,ACC06和ACC07,它们也会被加载。 最后,在4月5日,我们加载现有帐户,这些帐户的销售编号与上一个值相比发生了变化

现在,考虑到我的所有账户在2019年4月5日都处于活跃状态,我必须每天进行一次错误报告,结果如下

NO OF ACCOUNTS实际上是每天结束时活动帐户的计数

在上面的列表报告1中,我能够在ReportStudio中使用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
现在,我的要求是生成下面的交叉表,并对性别进行切割


致以最诚挚的问候

您可以通过自联接轻松拆分总数,但我不知道帐户数是如何设置的。你必须更好地解释

要分割销售,您可以使用此

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;
您可以选择实际需要的列


是一个DBFIDLE。

我们现在的帐户是如何在当天激活的?有账户吗?哦。很抱歉我错过了这个问题。实际上,这个表应该同时有活动帐户和关闭帐户。但是,由于我试图开发一个查询,我想只考虑活动帐户。但是,是的,在这个表中会有一个1=活动,0=关闭的标志。谢谢你的回复。但累积不是我想要的。如果没有O帐户,我需要在每天结束时报告活动帐户的总数,Report1SQL查询能够实现这一点。另一方面,每日总销售额是每日的总和。在同一个报表中,如果我只对该销售列求和,那么我将得到正确的结果。当我试图通过男性/女性获得账户和销售额时,会出现困难。嗨,GuidoG-非常感谢你的回复。你的建议非常有效,我现在能够得到正确的日终销售额。但考虑到我必须在每天结束时报告活动账户总数,我仍在努力找出正确的账户数量。报告书2表格编号正是我希望达到的目标,很简单。我只是修改了Report1查询,如下所示,在交叉表中没有得到所需的结果。选择DISTINCT D1.DAY,从DAILY_表D2中选择COUNTDISTINCT D2.ACCN_NO,其中D2.DAY错过了上面的分组-选择DISTINCT D1.DAY,从DAILY_表D2中选择COUNTDISTINCT D2.ACCN_NO,其中D2.DAY