Oracle SQL - разделите один столбец запроса из нескольких строк на другой - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно рассчитать ежедневные непогашенные продажи (DSO) для моего финансового директора, торгуя за 12 финансовых периодов.DSO рассчитывается следующим образом:

ar_balance / (credit_sales_sum / days_in_period)

Вот мой запрос на получение ar_balance, сгруппированный по периоду:

SELECT EXTRACT(month FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date) AS month, 
 SUM(ABS(v_glacct_ybb_all_periods_cumm.period_balance)) as ar_balance
FROM v_glacct_ybb_all_periods_cumm
WHERE (v_glacct_ybb_all_periods_cumm.glperiods_end_date BETWEEN 
 add_months(TRUNC(sysdate, 'month'), -12) AND TRUNC(sysdate, 'month'))
 AND (acct='1100-00-10-00')
GROUP by v_glacct_ybb_all_periods_cumm.glperiods_end_date
ORDER by v_glacct_ybb_all_periods_cumm.glperiods_end_date

Это дает мне результат, который выглядит примерно так:

MONTH AR_BALANCE
----- -----------
9     $102,408.33
10    $163,715.86
11    $114,683.96
12    $198,223.75
1     $155,598.19
2     $123,121.00
etc   etc

Теперь вот мой запрос для получения credit_sales_sum, разделенного на days_in_period, снова сгруппированного по периоду:

SELECT EXTRACT(month FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date) AS month, 
 ROUND((sum(abs(v_glacct_ybb_all_periods_cumm.period_balance))) / 
 (EXTRACT(day FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date)),2) AS sales_calc
FROM v_glacct_ybb_all_periods_cumm
WHERE(v_glacct_ybb_all_periods_cumm.glperiods_end_date BETWEEN add_months(TRUNC(sysdate, 'month'), -12)
 AND TRUNC(sysdate, 'month'))
 AND (acct='4080-00-10-00' OR acct='4090-00-10-00' OR acct='4095-00-10-00' OR acct='4096-00-10-00')
GROUP BY v_glacct_ybb_all_periods_cumm.glperiods_end_date
ORDER BY v_glacct_ybb_all_periods_cumm.glperiods_end_date

Это дает мне многострочный результат, аналогичный первому запросу:

MONTH SALES_CALC
----- ----------
9     $48,975.43
10    $44,167.89
11    $48,997.81
12    $49,493.17
1     $48,218.43
2     $52,523.84
etc   etc

Что сейчас приводит к моей проблеме.Я не знаю, как разделить результаты столбца AR_BALANCE первого запроса на столбец SALES_CALC второго запроса, а также включить столбец MONTH как есть.Я пробовал решение из этого вопроса , но я получаю сообщение об ошибке "Поле '=' неизвестного типа".После нескольких часов поисков у меня закончились идеи.Как это можно сделать?

1 Ответ

0 голосов
/ 24 сентября 2018

Поправь меня, если я ошибаюсь.Если вам нужно разделить результаты двух промежуточных запросов и получить столбец MONTH, просто раскомментируйте ваши запросы в скрипте и удалите мои тестовые входные данные.

with ar_bal_tab as (
/*
SELECT EXTRACT(month FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date) AS month, 
 SUM(ABS(v_glacct_ybb_all_periods_cumm.period_balance)) as ar_balance
FROM v_glacct_ybb_all_periods_cumm
WHERE (v_glacct_ybb_all_periods_cumm.glperiods_end_date BETWEEN 
 add_months(TRUNC(sysdate, 'month'), -12) AND TRUNC(sysdate, 'month'))
 AND (acct='1100-00-10-00')
GROUP by v_glacct_ybb_all_periods_cumm.glperiods_end_date
ORDER by v_glacct_ybb_all_periods_cumm.glperiods_end_date
*/
select 9 as month, 102408.33 as ar_balance from dual
union all
select 10 as month, 163715.86 as ar_balance from dual
union all
select 11 as month, 114683.96 as ar_balance from dual
union all
select 12 as month, 198223.75 as ar_balance from dual
union all
select 1 as month, 155598.19 as ar_balance from dual
union all
select 2 as month, 123121.00 as ar_balance from dual
),
sales_calc_tab as (
/*
SELECT EXTRACT(month FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date) AS month, 
 ROUND((sum(abs(v_glacct_ybb_all_periods_cumm.period_balance))) / 
 (EXTRACT(day FROM v_glacct_ybb_all_periods_cumm.glperiods_end_date)),2) AS sales_calc
FROM v_glacct_ybb_all_periods_cumm
WHERE(v_glacct_ybb_all_periods_cumm.glperiods_end_date BETWEEN add_months(TRUNC(sysdate, 'month'), -12)
 AND TRUNC(sysdate, 'month'))
 AND (acct='4080-00-10-00' OR acct='4090-00-10-00' OR acct='4095-00-10-00' OR acct='4096-00-10-00')
GROUP BY v_glacct_ybb_all_periods_cumm.glperiods_end_date
ORDER BY v_glacct_ybb_all_periods_cumm.glperiods_end_date
*/
select 9 as month, 48975.43 as sales_calc from dual
union all
select 10 as month ,44167.89 as sales_calc from dual
union all
select 11 as month ,48997.81 as sales_calc from dual
union all
select 12 as month ,49493.17 as sales_calc from dual
union all
select 1 as month ,48218.43 as sales_calc from dual
union all
select 2 as month, 52523.84 as sales_calc from dual
)
select 
    abt.month,
     ar_balance / sales_calc as DSO
    from ar_bal_tab abt,
         sales_calc_tab sct
     where abt.month = sct.month

Надеюсь, это поможет.Дионис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...