Объединение двух запросов во временную таблицу без аналогичных столбцов - PullRequest
0 голосов
/ 24 марта 2020

Я все еще относительно новичок в использовании Oracle SQL и искал некоторую помощь по этой проблеме, которую я пытался решить:

У меня есть два отдельных запроса, к которым мне нужно как-то присоединиться вместе, чтобы создать временную таблицу с некоторыми значениями. Два запроса, которые не имеют перекрывающихся элементов:

select
t.segment,
sum(Case when t.cost >= 750000 then 750000 else t.cost end)/sum(t.revenue) as seg_pool

from data3 t
where t.date <= t.forecast_month and t.period = 'Current'
group by t.segment;

и

select
r.level,
sum(Case when t.cost >= 750000 then 750000 else t.cost end)/sum(revenue) as level_pool,
sum(Case when t.segment = 'S' then t.revenue else 0 end)/sum(t.revenue) as s_weight

from data3 t
left join sb.com r on t.state=r.state and t.cnty=r.cnty
where t.date <= t.forecast_month and t.period = 'Current'
group by r.level;

Вывод из запроса 1 выглядит как

Segment   Seg_pool
A         .078
B         .09

И Вывод из запроса 2 выглядит как

Level  Level_pool s_weight
L      .06          .80
M      .08          .82
H      .09          .83

Мне нужно создать временную таблицу или отдельный запрос, который выполняет арифметическую операцию c для этих значений и выводит ее по комбинации сегмент / уровень. Операция арифметики c отличается для сегментов A и B: для сегментов A L, M и H формула имеет вид

A_pool% = levelpool -(segpoolB - segpoolA) ∗ (1 -s_weight)

Для сегментов B L, M и H - формула равно

B_pool% = A_pool% + (segpoolB - segpoolA)

Таким образом, результирующая временная таблица, которую мне нужно создать, выглядела бы примерно так, с "разницей" в качестве разницы между значением пула сегментов A & B

Segment Level Pool% s_weight difference
A       L     0.06   0.80     0.12
A       M     0.08   0.82     0.12
A       H     0.09   0.83     0.12
B       L     0.06   0.80     0.12
B       M     0.08   0.82     0.12
B       H     0.09   0.83     0.12

Или, может быть, было бы полезно просто добраться до этой таблицы, что является конечным результатом, который мне действительно нужно получить:

Segment Level Level_Pool 
A       L     0.0576
A       M     0.07784
A       H     0.08796
B       L     0.0696
B       M     0.08984
B       H     0.0996

Любая помощь, полученная в этой окончательной временной таблице или запросе, будет высоко ценится, или просто указание в правильном направлении о том, как объединить два запроса, которые я уже настроил ... спасибо, Джордан:)

1 Ответ

0 голосов
/ 24 марта 2020

WITH предложение факторинга или CTE (Common Table Expression) может помочь. Например:

WITH a
     AS (  SELECT t.segment,
                    SUM (
                       CASE WHEN t.cost >= 750000 THEN 750000 ELSE t.cost END)
                  / SUM (t.revenue)
                     AS seg_pool
             FROM data3 t
            WHERE     t.date <= t.forecast_month
                  AND t.period = 'Current'
         GROUP BY t.segment),
     b
     AS (  SELECT r.LEVEL,
                    SUM (
                       CASE WHEN t.cost >= 750000 THEN 750000 ELSE t.cost END)
                  / SUM (revenue)
                     AS level_pool,
                    SUM (CASE WHEN t.segment = 'S' THEN t.revenue ELSE 0 END)
                  / SUM (t.revenue)
                     AS s_weight
             FROM data3 t
                  LEFT JOIN sb.com r
                     ON     t.state = r.state
                        AND t.cnty = r.cnty
            WHERE     t.date <= t.forecast_month
                  AND t.period = 'Current'
         GROUP BY r.LEVEL)
SELECT whatever
  FROM a join b on ...
  WHERE ...

Я не совсем понял, как получить конечный результат, но - если вы знаете, как объединить эти два запроса, теперь у вас есть механизм , чтобы сделать это.

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