SAP HANA:创建具有最大日期的连接
SAP HANA: Create a join with a max on date
我正忙于 SAP HANA 开发,但 运行 遇到货币转换问题。
在联接的左侧,我有一个投影,其中包含销售订单号、客户要求的交货日期和单据货币的订单价值(来自 VBAK/VBAP)。在联接的右侧,我有一个包含 TCURR table(来自 SAP)的投影,根据 MAER(月平均汇率)和 "from currency" 联接以记录来自销售订单的货币。我需要将文档货币的价值转换为欧元,但必须 select TCURR 中可用的最新汇率。我该如何加入?如此有效,我需要将销售订单的日期加入到最大(汇率日期),但必须小于或等于销售订单日期。
能否请您检查以下 HANA 数据库 SQLScript
我使用 multiple SQL CTE expressions on HANA SQLScript 获取了每种货币转换为 EUR 的最新条目
然后将此 CTE tables(最后一个 CTE3)加入 VBAK table
其实我没有用货币汇率做金额换算,我想你可以在SELECT列表
上用乘法或除法等来处理
with cte as (
select
to_date( to_nvarchar(99999999 - gdatu) ) gdate,
*
from "SAPS4S".TCURR
where tcurr = 'EUR'
), cte2 as (
select
row_number() over (partition by fcurr, YEAR(gdate), MONTH(gdate) order by gdate desc) as rn,
YEAR(gdate) as gdate_year,
MONTH(gdate) as gdate_month,
*
from cte
), cte3 as (
select * from cte2 where rn = 1
)
select
vbeln,
erdat,
netwr,
waerk,
cte3.*
from "SAPS4S".VBAK as vbak
left join cte3
on
vbak.waerk = cte3.fcurr and
YEAR(vbak.erdat) = cte3.gdate_year and
MONTH(vbak.erdat) = cte3.gdate_month;
你好欧尼,
根据您的第二条评论,我将 SQLScript 查询稍微更改如下
with cte as (
select
to_date( to_nvarchar(99999999 - gdatu) ) gdate,
*
from "SAPABAP1".TCURR
where tcurr = 'EUR'
), cte2 as (
select
vbeln,
erdat,
netwr,
waerk,
sum(1) over (partition by vbeln order by gdate desc rows unbounded preceding) as rownum,
cte.*
from "SAPABAP1".VBAK as vbak
left join cte
on
vbak.waerk = cte.fcurr and
vbak.erdat >= cte.gdate
)
select *
from cte2
where ifnull(rownum,1) = 1
如果它适用于您的数据库并得到您的反馈,我将很高兴
有来自 TCURR 的 NULL 记录table,因为没有货币汇率条目或单据货币已被定义为欧元(实际上汇率应该等于 1)
我正忙于 SAP HANA 开发,但 运行 遇到货币转换问题。
在联接的左侧,我有一个投影,其中包含销售订单号、客户要求的交货日期和单据货币的订单价值(来自 VBAK/VBAP)。在联接的右侧,我有一个包含 TCURR table(来自 SAP)的投影,根据 MAER(月平均汇率)和 "from currency" 联接以记录来自销售订单的货币。我需要将文档货币的价值转换为欧元,但必须 select TCURR 中可用的最新汇率。我该如何加入?如此有效,我需要将销售订单的日期加入到最大(汇率日期),但必须小于或等于销售订单日期。
能否请您检查以下 HANA 数据库 SQLScript
我使用 multiple SQL CTE expressions on HANA SQLScript 获取了每种货币转换为 EUR 的最新条目 然后将此 CTE tables(最后一个 CTE3)加入 VBAK table
其实我没有用货币汇率做金额换算,我想你可以在SELECT列表
上用乘法或除法等来处理with cte as (
select
to_date( to_nvarchar(99999999 - gdatu) ) gdate,
*
from "SAPS4S".TCURR
where tcurr = 'EUR'
), cte2 as (
select
row_number() over (partition by fcurr, YEAR(gdate), MONTH(gdate) order by gdate desc) as rn,
YEAR(gdate) as gdate_year,
MONTH(gdate) as gdate_month,
*
from cte
), cte3 as (
select * from cte2 where rn = 1
)
select
vbeln,
erdat,
netwr,
waerk,
cte3.*
from "SAPS4S".VBAK as vbak
left join cte3
on
vbak.waerk = cte3.fcurr and
YEAR(vbak.erdat) = cte3.gdate_year and
MONTH(vbak.erdat) = cte3.gdate_month;
你好欧尼, 根据您的第二条评论,我将 SQLScript 查询稍微更改如下
with cte as (
select
to_date( to_nvarchar(99999999 - gdatu) ) gdate,
*
from "SAPABAP1".TCURR
where tcurr = 'EUR'
), cte2 as (
select
vbeln,
erdat,
netwr,
waerk,
sum(1) over (partition by vbeln order by gdate desc rows unbounded preceding) as rownum,
cte.*
from "SAPABAP1".VBAK as vbak
left join cte
on
vbak.waerk = cte.fcurr and
vbak.erdat >= cte.gdate
)
select *
from cte2
where ifnull(rownum,1) = 1
如果它适用于您的数据库并得到您的反馈,我将很高兴
有来自 TCURR 的 NULL 记录table,因为没有货币汇率条目或单据货币已被定义为欧元(实际上汇率应该等于 1)