【问题标题】:How do I construct a CASE expression in SQL applying a for a simple estimation for the future with conditions?How do I construct a CASE expression in SQL applying a for a simple estimation for the future with conditions?
【发布时间】:2023-02-26 00:06:51
【问题描述】:

如何使用 type = 'A' 等条件修改以下 CASE 表达式,并创建一般因子为 1.5 的 2023 年估计值?

请参阅fiddle 以供参考。 我的数据表如下:

|id |transaction_date   |cost   |type|
|1  |2019-01-01         |94.12  |A   |
|2  |2019-02-15         |95.01  |A   |
|5  |2020-03-01         |36.22  |A   |
|3  |2020-05-16         |45.22  |B   |
|4  |2020-06-10         |10.84  |A   |
|6  |2020-12-09         |12.42  |A   |
|8  |2021-02-28         |72.44  |B   |
|9  |2021-04-16         |91.08  |A   |
|7  |2021-05-16         |64.88  |A   |
|12 |2022-01-22         |55.87  |B   |
|13 |2022-04-06         |99.66  |A   |
|10 |2022-06-09         |53.34  |A   |
|11 |2022-10-05         |36.93  |A   |
|14 |2022-11-18         |90.04  |A   |
|15 |2023-01-23         |82.30  |A   |

此 SQL 查询确实指定 type = 'A' 并对 'A' 列求和 但不包含 2023 年的估计。

select EXTRACT(YEAR FROM item_.transaction_date) AS year,
    sum(case when EXTRACT(YEAR FROM CURRENT_DATE)>EXTRACT(YEAR FROM item_.transaction_date) AND type = 'A' 
        then item_.cost 
        else 0 end) 
            as box_A
from item_
    GROUP BY year
    order by year;
|year|  box_a |
|2019|  189.13|
|2020|  59.48 |
|2021|  155.96|
|2022|  279.97|
|2023|  0     |

以下 SQL 查询确实包含 2023 年的估计值,但没有条件,因此未指定类型 = 'A',因此 box_a 中的 * 包含错误的值。

  select EXTRACT(YEAR FROM item_.transaction_date) AS year,
    CASE WHEN EXTRACT(YEAR FROM item_.transaction_date) < date_part('year', CURRENT_DATE)
   THEN sum( item_.cost  ) 
  ELSE (SELECT sum( item_.cost) FROM item_ WHERE EXTRACT(YEAR FROM item_.transaction_date) = date_part('year', CURRENT_DATE - INTERVAL '1 year') 
  ) * 1.5
  END
            as box_a
from item_
    GROUP BY year
  Order by year;
|year|  box_a   |
|2019|  189.13  |
|2020|  *104.70*|
|2021|  *228.40*|
|2022|  *335.84*|
|2023|  *503.76*|

这就是我想要的

|year|  box_a |
|2019|  189.13|
|2020|  59.48 |
|2021|  155.96|
|2022|  279.97|
|2023|  419.96|     |

这个 stackoverflow solution 很适合用于 WITHOUT 条件。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以使用LAG()。例如:

    select 
      year,
      case when box_a = 0 then lag(box_a) over(order by year) * 1.5
           else box_a 
      end as box_a
    from ( -- original query here
      select
        EXTRACT(YEAR FROM item_.transaction_date) AS year,
        sum(case when EXTRACT(YEAR FROM CURRENT_DATE) >
            EXTRACT(YEAR FROM item_.transaction_date) AND type = 'A' 
            then item_.cost 
            else 0 end
        ) as box_A
      from item_
      GROUP BY year
    ) x
    order by year
    

    fiddle

    笔记:作为一般规则,我个人更喜欢使用 null 来表示数据的缺失,而不是值零,理论上它可能是一个有效的数量。

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 2022-12-02
      • 2022-12-02
      • 2022-12-02
      • 2022-08-17
      • 2022-01-04
      • 2021-11-18
      • 2022-12-01
      • 2022-12-27
      相关资源
      最近更新 更多