You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教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脚本的可行步骤

  1. 获取原函数定义:直接在原数据库中查询函数逻辑,不同数据库执行语句略有差异:
    -- 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'));
    
  2. 确认业务逻辑:如果无法查询函数定义,联系数据库管理员或业务人员,明确这两个函数是否关联其他业务表(比如产品参数表),以及具体计算规则
  3. 复刻到Qlik Sense:
    • 若函数是简单查表逻辑,直接在Qlik加载脚本中用JOIN关联对应表,计算出chambre和dicke字段
    • 若逻辑复杂,用Qlik的自定义函数(Function或Sub)封装对应逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:00:58