Создание ежедневного отчета на основе SQL-запроса с добавочными записями - PullRequest
1 голос
/ 04 июля 2019

У меня есть требование создать кросс-таблицу, используя базу данных, которая загружает только инкрементные записи.Пожалуйста, рассмотрите следующий пример, Таблица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 объяснены ниже:

1 апреля есть 4 счета с их номерами продаж и полом владельца счета.
На 2-мВ апреле произошли некоторые изменения в продажах номеров для всех учетных записей, и поэтому они были загружены.
Но 3 апреля мы загружаем только добавочные счета.Как видно, продажи ТОЛЬКО ACC01 изменились, а также появился новый аккаунт ACC05.Таким образом, будут загружены только эти 2 учетные записи.
Опять же, 4 апреля, существующая учетная запись ACC02 имеет увеличение продаж по сравнению с предыдущим значением и, следовательно, она загружается.Наряду с этим, есть 2 новые учетные записи, ACC06 и ACC07, которые также загружаются.
Наконец, 5 апреля, мы загружаем существующие учетные записи, чьи номера продаж изменились по сравнению с их последним значением.

Теперь я должен делать ежедневные отчеты MIS, и результат должен быть следующим, учитывая, что все мои учетные записи активны по состоянию на 5 апреля 2019 года.

enter image description here

БЕЗ СЧЕТОВ фактически является количеством активных учетных записей на конец каждого дня.

В приведенном выше списке отчета 1 я смог выполнить следующий подзапрос с использованием Cognos.Элементы запросов / SQL в Report Studio:

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

Теперь мое требование заключается в создании следующей кросс-таблицы с разрезом по полу.

enter image description here

С наилучшими пожеланиями

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вы можете легко разделить итоговые значения самостоятельно, но я не понимаю, как настроен 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   
0 голосов
/ 04 июля 2019

Просто используйте накопительные суммы.Следующее генерирует все дневные и кумулятивные значения для мужчин и женщин:

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;

Вы можете выбрать, какие столбцы вы действительно хотите.

Здесь - это дб <> скрипка.

...