SQL 将一行分成四个不同行的函数

SQL function to divide one row in four distinct rows

有没有人知道如何将一年的财务收入从一行拆分成四行代表四个季度? (假设每个季度产生相同数量的收入)?下面是一个例子:上面是我目前拥有的,下面是我想要实现的拆分。

我在互联网上做了一些研究,发现 CROSS JOIN 肯定有帮助,但不知道如何。

像这样的东西应该可以工作:

select geo_level1,geo_level2,year,q.quarter,revenue / 4
from table t
join (select * from values ((1),(2),(3),(4)) q(quarter))
 on 1 = 1 

HANA 带有特定的分解函数,适用于 SERIES tables/data 并且可以处理 水平分解 类似于所描述的要求。 (参见文档 here

然而,系列数据需要一些预先思考和熟悉概念,因此以下是解决问题的声明的“系列灯”版本:

DROP TABLE geo_years;
CREATE COLUMN TABLE geo_years(
    geo_level_1 nvarchar (20)
    , geo_level_2 nvarchar (20)
    , YEAR integer
    , revenue decimal (10, 2)
);

INSERT INTO geo_years VALUES ('EUROPE', 'FRANCE', 2020, 100.00);
INSERT INTO geo_years VALUES ('EUROPE', 'FRANCE', 2021, 200.00);

SELECT 
      gy.geo_level_1
    , gy.geo_level_2
    , gy."YEAR"
    , st.GENERATED_PERIOD_START pstart
    , quarter(add_months(to_date(gy."YEAR"), 3 * (st.GENERATED_period_start-1))) AS QUATER_DATE
    , to_decimal (revenue / 4, 10, 2) AS revenue_disagg
    FROM 
        geo_years gy
    cross JOIN series_generate_integer (1, 1, 5) st
ORDER BY
    geo_level_1, geo_level_2, "YEAR", pstart;

GEO_LEVEL_1|GEO_LEVEL_2|YEAR|PSTART|QUATER_DATE|REVENUE_DISAGG|
-----------+-----------+----+------+-----------+--------------+
EUROPE     |FRANCE     |2020|     1|2020-Q1    |         25.00|
EUROPE     |FRANCE     |2020|     2|2020-Q2    |         25.00|
EUROPE     |FRANCE     |2020|     3|2020-Q3    |         25.00|
EUROPE     |FRANCE     |2020|     4|2020-Q4    |         25.00|
EUROPE     |FRANCE     |2021|     1|2021-Q1    |         50.00|
EUROPE     |FRANCE     |2021|     2|2021-Q2    |         50.00|
EUROPE     |FRANCE     |2021|     3|2021-Q3    |         50.00|
EUROPE     |FRANCE     |2021|     4|2021-Q4    |         50.00|

这里的关键要素是:

  • geo_year 中的每条记录生成 4 条记录:这是由 CROSS JOIN series_generate_integer (1, 1, 5) st 完成的。有关此功能,请参阅文档 here
  • 计算每个季度的开始日期并将结果格式化为 YYYY-QTR:quarter(add_months(to_date(gy."YEAR"), 3 * (st.GENERATED_period_start-1))) AS QUATER_DATE
  • REVENUE 平均分配到季度数 (4):to_decimal (revenue / 4, 10, 2) AS revenue_disagg

仅此而已。