Изменение даты и группы к концу финансового месяца

StackOverflow https://stackoverflow.com/questions/1044415

  •  20-08-2019
  •  | 
  •  

Вопрос

Я создал следующую таблицу (через UNION ALL):

ID        Date         Hour   Weight    Fiscal
AAA       1/27/2009     0      10         0
AAA       1/30/2009     0      20         0
AAA       2/14/2009     0      10         0
AAA       2/18/2009     0      20         0
AAA       2/27/2009     0      20         0
AAA       2/28/2009     0      20         0
AAA       1/14/2009     10     0          0
AAA       2/14/2009     20     0          0
AAA       2/16/2009     10     0          0
AAA       2/25/2009     10     0          0
AAA       2/26/2009     10     0          0
AAA       3/3/2009          20     0          0
NULL          0                 0      0          1/28/2009
NULL          0                 0      0          2/27/2009
NULL          0                 0      0          3/29/2009

И я хотел бы получить:

    ID      Date        Hour    Weight
    AAA     1/28/2009   10  10
    AAA     2/27/2009   50  50
    AAA     3/29/2009   20  20

Сначала следует преобразовать столбец DATE в FISCAL следующего финансового месяца (например, 27.01.2007 - > 28.01.2009, 30.01.2009 - > 2 / 27/2009 и т. Д.), А затем сгруппировать по этому значению.

Я смог использовать:

    SELECT  ID
    ,       left(CONVERT(VARCHAR(10)
    ,       date, 111),7) as Date
    ,       round(sum(Hours),0) as Hours
    ,       round(sum(Weight),0) as Weight
    FROM    ...
    GROUP   BY ID
    ,       left(CONVERT(VARCHAR(10), date, 111),7)
    ORDER   by ID ASC
    ,       left(CONVERT(VARCHAR(10), date, 111),7) ASC

Но это просто группировка по календарным датам, а не по окончанию финансового месяца, который у меня есть в столбце FISCAL .

Это было полезно?

Решение

Вы не должны объединять финансовые даты в свою таблицу. Но с таблицей, как у вас сейчас, вы могли бы сначала создать таблицу (используя WITH, поэтому никаких специальных привилегий не требуется) с финансовыми «периодами» и объединить эту таблицу с вашей основной таблицей.

Я назвал ваш стол ТАК. Мне также пришлось переименовать ваши столбцы в cHour и CDate, потому что в Oracle как минимум Date является зарезервированным словом. Скорее всего, вы могли бы создать таблицу «main» и таблицу «fiscal» непосредственно из исходных таблиц, чтобы ускорить процесс:

with fiscal_part as (
            select fiscal
            from   SO
            where  fiscal is not null)
,    fiscal as (
            select fb.fiscal         fiscal_begin
            ,      min(fe.fiscal)    fiscal_end
            from   fiscal_part fb right join 
                   fiscal_part fe
                on fe.fiscal > fb.fiscal
            group by fb.fiscal)
,    main as (
            select *
            from   SO
            where  fiscal is null)
select main.ID
,      fiscal.fiscal_end
,      sum(main.cHour)
,      sum(main.weight)
from   main
join   fiscal on main.cdate >= coalesce(fiscal.fiscal_begin, main.cdate)
             and main.cdate <  fiscal.fiscal_end
group by main.ID
,      fiscal.fiscal_end
order by fiscal.fiscal_end

Также обратите внимание, что в вашем примере данных есть ошибка; вес вашего последнего периода должен быть 40 (строки с датами 2/27 и 2/28).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top