【问题标题】:two calculated columns that need each other两个相互需要的计算列
【发布时间】:2020-04-02 12:13:48
【问题描述】:

免责声明:我正在使用 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 |
    +----------+------+------------+---------------+---------+-------+

我需要计算未来的回报,以及“opening_stock”,即我们还有多少商品可以在商店出售。

当场景是“过去”时,returns = 返回(因为我们已经有了过去的数据)

返回,当场景是未来时 = -0.05 * Opening_stock(我们称之为returns_v2)

Opening_stock = running total = SUM(sold_store - sold_customer +returns) over (ORDER by week)(除了 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 使用第1 周的回报,它应该在未来的第一周这样做,但是我需要它来获取第1 周的returns_v2。 而且,returns_v2 需要能够使用 Opening_Stock。

我不知道如何编写查询来做到这一点,无论我使用多少子查询......感觉就像一个我无法摆脱的无限循环。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    我不明白你想要得到什么,但这个简单的 Cumultive Sum 似乎返回了预期的开盘价

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

    【讨论】:

      【解决方案2】:

      好的,我想我已经解决了这个问题。首先,您将回报显示为负数。如果您有 100 个退货,您不想将其添加到您的库存吗?

      这是我的逻辑,基于添加回报。基本上,你必须计算你的跑步总数两次。您在内部查询中计算它,然后在外部查询中使用该值。如果您使用负数作为回报,它与您的数字相匹配。

      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                |
          +-----------+----+------------+---------------+-------+-------+---------------+-------+---------------------+
      

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 2015-06-16
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        相关资源
        最近更新 更多