请教SQL中cu_cr_前缀函数在Qlik Sense数据加载转换中的作用
解析SQL自定义函数并转换为Qlik Sense数据加载脚本
问题背景
正在将一段业务SQL转换为Qlik Sense数据加载脚本,但无法明确cu_cr_anzahl_ptyp和cu_cr_dicke_ptyp这两个自定义函数的功能,原SQL代码如下:
SELECT a.auftrnr, a.lfdpos, a.bmnr, $1 datum, SUM(a.stk)::INTEGER istk, (SUM(a.stk)*c.breite*c.hoehe)/1000000 iqm, d.bmbez, cu_cr_anzahl_ptyp(c.aufnr, c.poskonr, c.tnrvater, 340) chambre, c.jobnr, c.schicht, cu_cr_dicke_ptyp(c.aufnr ,c.poskonr , c.tnrvater , 340) dicke FROM tt_bcydok a, pmyplan c, pmsbm d WHERE a.bmnr IN ( 7101 , 7103 ) { AND a.stk>0 } AND a.auftrnr = c.auftrnr AND a.lfdpos = c.plfdpos AND a.bmnr = c.bmnr AND a.bmnr = d.bmnr GROUP BY a.auftrnr,a.lfdpos,a.bmnr,d.bmbez,c.poskonr,c.tnrvater,c.aufnr, c.jobnr,c.schicht,c.breite,c.hoehe
函数功能推测
从命名和参数能提取关键线索:
cu_cr_是业务自定义前缀,anzahl是德语“数量”,dicke是德语“厚度”,ptyp大概率是“产品类型(Product Type)”的缩写- 参数里的
c.aufnr(订单号)、c.poskonr(位置编号)、c.tnrvater(父项编号)是业务表字段,固定值340可能是特定产品类别/类型代码 - 字段别名
chambre(法语“腔室/单元”,属于业务特定术语)对应数量函数,dicke对应厚度函数,推测这两个函数是根据订单、位置、父项信息,查询类型为340的产品的数量和厚度参数
转换Qlik Sense脚本的可行步骤
- 获取原函数定义:直接在原数据库中查询函数逻辑,不同数据库执行语句略有差异:
-- PostgreSQL示例 SELECT routine_definition FROM information_schema.routines WHERE routine_name IN ('cu_cr_anzahl_ptyp', 'cu_cr_dicke_ptyp'); -- SQL Server示例 SELECT definition FROM sys.sql_modules WHERE object_id IN (OBJECT_ID('cu_cr_anzahl_ptyp'), OBJECT_ID('cu_cr_dicke_ptyp')); - 确认业务逻辑:如果无法查询函数定义,联系数据库管理员或业务人员,明确这两个函数是否关联其他业务表(比如产品参数表),以及具体计算规则
- 复刻到Qlik Sense:
- 若函数是简单查表逻辑,直接在Qlik加载脚本中用
JOIN关联对应表,计算出chambre和dicke字段 - 若逻辑复杂,用Qlik的自定义函数(
Function或Sub)封装对应逻辑
- 若函数是简单查表逻辑,直接在Qlik加载脚本中用
Qlik Sense加载脚本初步框架
LOAD a.auftrnr, a.lfdpos, a.bmnr, '$1' AS datum, // 原SQL中的$1是参数,需替换为Qlik中的实际变量或固定值 SUM(a.stk) AS istk, (SUM(a.stk)*c.breite*c.hoehe)/1000000 AS iqm, d.bmbez, -- 待替换为cu_cr_anzahl_ptyp的实际逻辑 NULL() AS chambre, c.jobnr, c.schicht, -- 待替换为cu_cr_dicke_ptyp的实际逻辑 NULL() AS dicke FROM [tt_bcydok] a INNER JOIN [pmyplan] c ON a.auftrnr = c.auftrnr AND a.lfdpos = c.plfdpos AND a.bmnr = c.bmnr INNER JOIN [pmsbm] d ON a.bmnr = d.bmnr WHERE a.bmnr IN (7101, 7103) AND a.stk > 0 // 原SQL中{}包裹的是可选条件,这里直接启用有效过滤 GROUP BY a.auftrnr, a.lfdpos, a.bmnr, d.bmbez, c.poskonr, c.tnrvater, c.aufnr, c.jobnr, c.schicht, c.breite, c.hoehe;
内容的提问来源于stack exchange,提问作者Richard Lee
相关产品推荐
相关产品推荐

