【问题标题】:Create a SQL query based Daily report with Incremental Records使用增量记录创建基于 SQL 查询的每日报告
【发布时间】:2019-07-04 20:40:32
【问题描述】:

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

Table1 条目解释如下:

4 月 1 日有 4 个帐户,他们的销售编号和帐户持有人的性别。
4 月 2 日,所有帐户的销售编号都有一些变化,因此已加载。
但是在 4 月 3 日,我们只加载增量帐户。可以看出,ONLY ACC01 的销售额发生了变化,并且还有一个新帐户 ACC05。因此只会加载这两个帐户。
同样在 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

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

最好的问候

【问题讨论】:

  • 我们现在的帐户是如何在当天处于活动状态的?有accountstable 吗?
  • 哦。对不起。我错过了这个问题。实际上,该表应该同时具有 - 活动帐户和已关闭帐户。但由于我试图开发一个查询,我想到只考虑活跃帐户。但是,是的,在这个表中会有一个 1=Active 和 0=Closed 的标志。

标签: sql sql-server database cognos-10


【解决方案1】:

您可以通过自我加入轻松拆分总数,但我不明白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   

【讨论】:

  • 嗨 GuidoG - 非常感谢您的回复。您的建议非常有效,我现在能够获得正确的日终销售值。但考虑到我必须在每天结束时报告活跃账户总数,我仍在试图找出正确的账户数。 Report 2 table nos 是我希望实现的。
  • 很简单。我刚刚修改了 Report 1 查询,如下所示,但在交叉表中没有得到所需的结果。 SELECT DISTINCT D1.DAY, (SELECT COUNT(DISTINCT D2.ACCN_NO) FROM DAILY_TABLE D2 WHERE D2.DAY &lt;= D1.DAY AND D2.GENDER='MALE') AS MALE_NO_OF_ACCOUNTS, (SELECT COUNT(DISTINCT D2.ACCN_NO) FROM DAILY_TABLE D2 WHERE D2.DAY &lt;= D1.DAY AND D2.GENDER='FEMALE') AS FEMALE_NO_OF_ACCOUNTS FROM DAILY_TABLE D1 GROUP BY D1.DAY。感谢您的指导。欣赏。
  • 在上面错过了一个组 - SELECT DISTINCT D1.DAY, (SELECT COUNT(DISTINCT D2.ACCN_NO) FROM DAILY_TABLE D2 WHERE D2.DAY &lt;= D1.DAY AND D2.GENDER='MALE' GROUP BY D2.GENDER) AS MALE_NO_OF_ACCOUNTS, (SELECT COUNT(DISTINCT D2.ACCN_NO) FROM DAILY_TABLE D2 WHERE D2.DAY &lt;= D1.DAY AND D2.GENDER='FEMALE' GROUP BY D2.GENDER) AS FEMALE_NO_OF_ACCOUNTS FROM DAILY_TABLE D1 GROUP BY D1.DAY
【解决方案2】:

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

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 是一个 dbfiddle。

【讨论】:

  • 感谢您的回复戈登。但累积不是我想要的。如果没有帐户,我将在每天结束时报告活动帐户的总数,并且报告 1 sql 查询能够实现这一点。另一方面,每日总销售额是每日总和。在同一份报告中,如果我只是在那个 SALES 列上求和,那么我会得到正确的结果。当我尝试按男性/女性获取客户和销售额时出现了困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2020-08-22
  • 2019-01-25
相关资源
最近更新 更多