два вычисляемых столбца, которые нужны друг другу - PullRequest
1 голос
/ 02 апреля 2020

Отказ от ответственности: я использую Teradata и пытаюсь построить представление

У меня есть это представление, к которому я обращаюсь:

    +----------+------+------------+---------------+---------+-------+
    | scenario | week | sold_store | sold_customer | returns | price |
    +----------+------+------------+---------------+---------+-------+
    | past     |    1 |       5000 |          2500 | 100     |    50 |
    | future   |    2 |        100 |            50 | null    |    50 |
    | future   |    3 |         50 |            10 | null    |    50 |
    +----------+------+------------+---------------+---------+-------+

Мне нужно рассчитать будущие доходы, так как а также «открытие_сток», которое означает, сколько предметов у нас еще есть в наличии для продажи в магазинах.

Когда сценарий «прошлый», возвращается = возвращается (потому что у нас уже есть данные за прошлое)

Возвращает, когда сценарий является будущим = -0,05 * Открытие_сток (назовем его return_v2)

Открытие_сток = итоговая сумма = SUM (sold_store - sold_customer + возврат) более (ЗАКАЗАТЬ по неделе) (за исключением 3 значения должны быть равными единице недели-1)

Дело в том, что для возвратов говорят, что

Case Scenario
WHEN 'past' then returns
ELSE -0.05 * Opening_SIT
END as returns_v2

не работает, потому что Opening_SIT использовал оригинальный столбец «возвратов» (через LAG (), который я сохранил как столбец в подзапросе, например) вместо того, который я только что рассчитал с помощью моего оператора CASE.

Моя конечная цель будет получить:

+----------+------+------------+---------------+---------+-------+---------------+
| scenario | week | sold_store | sold_customer | returns | price | Opening_stock |
+----------+------+------------+---------------+---------+-------+---------------+
| past     |    1 |       5000 |          2500 | -100    |    50 | null          |
| future   |    2 |        200 |            50 | -120    |    50 | 2400          |
| future   |    3 |         50 |            10 | -121.5  |    50 | 2430          |
+----------+------+------------+---------------+---------+-------+---------------+

Основная проблема заключается в том, что Opening_Stock использует r возвраты недели-1, которые он должен сделать в течение первой будущей недели, но затем мне нужно взять return_v2 недели-1. Кроме того, return_v2 должен иметь возможность использовать Opening_Stock.

Я не знаю, как написать свой запрос, чтобы иметь возможность делать это, независимо от того, сколько подзапросов я использую ... Это похоже на бесконечность Я oop, из которого я не могу выйти.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Ладно, я думаю, что до этого добрался. Во-первых, вы показываете свою прибыль как отрицательный #. Если у вас было 100 возвратов, разве вы не хотите добавить , что к вашему текущему запасу?

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

create volatile table vt_foo
(scenario varchar(20),
wk int,
sold_store int,
sold_customer int,
rtrns int,
price int)
on commit preserve rows;


insert into vt_foo values (' past     ',1,5000,2500,100,50);
insert into vt_foo values (' future   ',2,100,50, null    ,50);
insert into vt_foo values (' future   ',3,50,10, null    ,50);

select
t.*,
sum(opening_stock) over (order by wk asc rows unbounded preceding) as running_stock
from (
select
t.*,
Sum(sold_store - sold_customer + coalesce(ret2,0)) Over (ORDER BY wk ROWS BETWEEN Unbounded Preceding AND 1 Preceding) as final_running_stock
from (
select
t.*,
Sum(sold_store - sold_customer + coalesce(rtrns,0)) Over (ORDER BY wk ROWS BETWEEN Unbounded Preceding AND 1 Preceding) as running_stock,
case
  when trim(scenario) = 'past' then cast ( rtrns as decimal(10,2))
  when trim(scenario) = 'future' then  0.05 * running_stock
 end as ret2

from
vt_foo t

Возвращает

    | scenario  | wk | sold_store | sold_customer | rtrns | price | running_stock | ret2  | final_running_stock |
    +-----------+----+------------+---------------+-------+-------+---------------+-------+---------------------+
    | past      |  1 |       5000 |          2500 | 100   |    50 | ?             | 100   | ?                   |
    | future    |  2 |        100 |            50 | ?     |    50 | 2600          | 130   | 2600                |
    | future    |  3 |         50 |            10 | ?     |    50 | 2650          | 132.5 | 2780                |
    +-----------+----+------------+---------------+-------+-------+---------------+-------+---------------------+
0 голосов
/ 02 апреля 2020

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

Sum(sold_store - sold_customer + returns)
Over (ORDER BY Week
      ROWS BETWEEN Unbounded Preceding AND 1 Preceding)
...