Получение ORA-01476: делитель равен нулю, ошибка - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно получить общий объем за две четверти, поскольку запрос отображается в операторах CASE. Третий оператор CASE предназначен для деления общего объема за каждый квартал на общий MK_VOL.

Теперь проблема в том, что MK_VOL для каждого дня - это одно значение, поэтому по сути мне нужно получить MAX каждого дня, а затем SUM на весь квартал, чтобы получить MKT_SHARE (то есть SUM of VOL, деленное наСУММ МК_ВОЛ). Повторим еще раз: для MK_VOL это не просто получение суммы за весь квартал, а МАКС за каждый день, а затем итоговая сумма.

Как вы можете видеть, MK_VOL одинаково для 02-апреля.

Теперь мой третий оператор case пытается это сделать, и я получаю ошибку. Это то, что мне нужно, чтобы помочь или лучше решение.

Я пытался сделать подзапрос, но это тоже не сработало.

Набор данных ниже

DATE        Client   VOL    MK_VOL  
----------- -------- ----- -------          
01-APR      AB           2      45
02-APR      AC           3      46
02-APR      AG1         26      46
02-APR      AG2         48      46
03-APR      AD           4      47
06-SEP      AF           5      48
07-SEP      AF           8      50

Запрос ниже

SELECT CLIENT
       , SUM(CASE WHEN DATE BETWEEN '01-JUL-19' AND '30-SEP-19' THEN VOLUME END) AS Q3_VOLUME
       , SUM(CASE WHEN DATE BETWEEN '01-APR-19' AND '30-JUN-19' THEN VOLUME END) AS Q2_VOLUME
       , SUM(CASE WHEN DATE BETWEEN '01-JUL-19' AND '30-SEP-19' THEN VOLUME END) AS Q3_VOLUME 
          / sum(DISTINCT CASE WHEN DATE BETWEEN '01-JUL-19' AND '30-SEP-19' THEN MKT_VOL END) AS MKT_SHARE
FROM TB1
WHERE TRADE_DATE BETWEEN '01-APR-19' AND '30-SEP-19'
GROUP BY CLIENT

Ожидаемый результат должен быть полным VOL / SUM (MAX (MK_VOL) для каждого клиента.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

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

    Select
    CLIENT
   , SUM(CASE WHEN DATE BETWEEN 
   '01-JUL-19' AND '30-SEP-19' THEN 
       VOLUME END) ) 
    /(
     MAX(CASE WHEN DATE BETWEEN 
   '01-JUL-19' AND '30-SEP-19' THEN 
       MKT_VOLUME END) )  AS Q1
   , SUM(CASE WHEN DATE BETWEEN 
    '01-APR-19' AND '30-JUN-19' THEN 
    VOLUME END)
     /
    (
     MAX(DISTINCT CASE WHEN DATE 
        BETWEEN 
       '01-JUL-19' AND '30-SEP-19' THEN 
       MKT_VOLUME END) )  AS Q2
     From Table group by client
0 голосов
/ 24 октября 2019

Во-первых, ваша проблема здесь не только в том, что вы не могли вычислить значения так, как хотели, у вас была ошибка «ORA-01476: ошибка делителя равна нулю», что означает, что в вашем делителе есть нулевое значение. Вы должны это исправить или, по крайней мере, вы должны избегать этого, как я продемонстрирую ниже.

SELECT CLIENT
SUM(Q3_VOLUME)/SUM(CASE WHEN MKT_SHARE!=0 THEN MKT_SHARE END) V1,
SUM(Q2_VOLUME)/SUM(CASE WHEN MKT_SHARE!=0 THEN MKT_SHARE END) V2
FROM (
SELECT CLIENT,
       DATE   
       SUM(CASE WHEN DATE BETWEEN '01-JUL-19' AND '30-SEP-19' THEN VOLUME END) AS Q3_VOLUME,
       SUM(CASE WHEN DATE BETWEEN '01-APR-19' AND '30-JUN-19' THEN VOLUME END) AS Q2_VOLUME,
       MAX(DISTINCT CASE WHEN DATE BETWEEN '01-JUL-19' AND '30-SEP-19' THEN MKT_VOL END) AS MKT_SHARE
FROM TB1
WHERE TRADE_DATE BETWEEN '01-APR-19' AND '30-SEP-19'
GROUP BY CLIENT,DATE
)
GROUP BY CLIENT 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...