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
仅此而已。
有没有人知道如何将一年的财务收入从一行拆分成四行代表四个季度? (假设每个季度产生相同数量的收入)?下面是一个例子:上面是我目前拥有的,下面是我想要实现的拆分。
我在互联网上做了一些研究,发现 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
仅此而已。