有关Quick BI中新建字段被引用时出错问题分析

一、问题描述

零售订单数量

卷烟订单数量

非烟订单数量

同时购买卷烟和非烟订单数量

购买卷烟中购买非烟比例

16316

3263

14272

1219

37.36%

备注:

(1)卷烟订单:零售订单中有卷烟商品的订单

(2)非烟订单:零售订单中有非烟商品的订单

(3)同时购买卷烟和非烟订单:零售订单中既有卷烟又有非烟商品的订单,同时购买卷烟和非烟订单数量=卷烟订单数量+非烟订单数量-零售订单数量

(4)购买卷烟中购买非烟比例=同时够买卷烟和非烟订单数 / 卷烟订单数

在Quick BI数据集中

(1)新建计算字段“零售订单数量=lod_include{[类型]:COUNT(distinct [流水号]):[类型]='零售单'}”

(2)新建计算字段“卷烟订单数量=lod_include{[是否卷烟]:COUNT(distinct [流水号]):[是否卷烟]='卷烟'}”

(3)新建计算字段“非烟订单数量=lod_include{[是否卷烟]:COUNT(distinct [流水号]):[是否卷烟]='非烟'}”

(4)新建计算字段“同时购买卷烟和非烟订单数量=[卷烟订单数量]+[非烟订单数量]-[零售订单数量]”

(5)新建计算字段“购买卷烟中购买非烟的比例=[同时购买卷烟和非烟订单数量]/[卷烟订单数量]

在Quick BI仪表板中添加指标图,输入结果显然是不正确的。

二、问题分析

查看SQL代码

SELECT

  LOD_TP_0.`LOD_8AB699CEB93538` + LOD_TP_1.`LOD_926F669A54CB6C` - LOD_TP_2.`LOD_F08CAF0E524E3E` / LOD_TP_0.`LOD_8AB699CEB93538` AS LOD_0

FROM

  (

    SELECT

      '-' AS T_ALA_2_

    FROM

      `terminaldata2`.`sales` AS ASE_T_1_

    LIMIT

      0, 1

  ) AS LOD_TM

  CROSS JOIN (

    SELECT

      SUM(LOD_TR.`LOD_measure_result`) AS LOD_8AB699CEB93538

    FROM

      (

        SELECT

          AST_T_3_.`是否卷烟` AS LOD_280795B8AB3CAB

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

          LEFT JOIN `terminaldata2`.`products` AS AST_T_3_ ON ASE_T_1_.`商品条码` = AST_T_3_.`商品条码`

        GROUP BY

          AST_T_3_.`是否卷烟`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          AST_T_3_.`是否卷烟` AS LOD_280795B8AB3CAB,

          COUNT(

            distinct ASE_T_1_.`流水号`

          ) AS LOD_measure_result

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

          LEFT JOIN `terminaldata2`.`products` AS AST_T_3_ ON ASE_T_1_.`商品条码` = AST_T_3_.`商品条码`

        WHERE

          AST_T_3_.`是否卷烟` = '卷烟'

        GROUP BY

          AST_T_3_.`是否卷烟`

      ) AS LOD_TR ON LOD_TL.`LOD_280795B8AB3CAB` = LOD_TR.`LOD_280795B8AB3CAB`

  ) AS LOD_TP_0

  CROSS JOIN (

    SELECT

      SUM(LOD_TR.`LOD_measure_result`) AS LOD_926F669A54CB6C

    FROM

      (

        SELECT

          AST_T_3_.`是否卷烟` AS LOD_280795B8AB3CAB

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

          LEFT JOIN `terminaldata2`.`products` AS AST_T_3_ ON ASE_T_1_.`商品条码` = AST_T_3_.`商品条码`

        GROUP BY

          AST_T_3_.`是否卷烟`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          AST_T_3_.`是否卷烟` AS LOD_280795B8AB3CAB,

          COUNT(

            distinct ASE_T_1_.`流水号`

          ) AS LOD_measure_result

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

          LEFT JOIN `terminaldata2`.`products` AS AST_T_3_ ON ASE_T_1_.`商品条码` = AST_T_3_.`商品条码`

        WHERE

          AST_T_3_.`是否卷烟` = '非烟'

        GROUP BY

          AST_T_3_.`是否卷烟`

      ) AS LOD_TR ON LOD_TL.`LOD_280795B8AB3CAB` = LOD_TR.`LOD_280795B8AB3CAB`

  ) AS LOD_TP_1

  CROSS JOIN (

    SELECT

      SUM(LOD_TR.`LOD_measure_result`) AS LOD_F08CAF0E524E3E

    FROM

      (

        SELECT

          ASE_T_1_.`类型` AS LOD_601A3BCEB54372

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

        GROUP BY

          ASE_T_1_.`类型`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          COUNT(

            distinct ASE_T_1_.`流水号`

          ) AS LOD_measure_result,

          ASE_T_1_.`类型` AS LOD_601A3BCEB54372

        FROM

          `terminaldata2`.`sales` AS ASE_T_1_

        WHERE

          ASE_T_1_.`类型` = '零售单'

        GROUP BY

          ASE_T_1_.`类型`

      ) AS LOD_TR ON LOD_TL.`LOD_601A3BCEB54372` = LOD_TR.`LOD_601A3BCEB54372`

  ) AS LOD_TP_2

LIMIT

  0, 1

在上述代码中,第3行代码“LOD_TP_0.`LOD_8AB699CEB93538` + LOD_TP_1.`LOD_926F669A54CB6C` - LOD_TP_2.`LOD_F08CAF0E524E3E` / LOD_TP_0.`LOD_8AB699CEB93538` AS LOD_0”中百分比计算公式的分子中显然少了一个括号。

也就是说在quick bi新建计算字段“购买卷烟中购买非烟的比例=[同时购买卷烟和非烟订单数量]/[卷烟订单数量]”时,quick bi 并没有把[同时购买卷烟和非烟订单数量]作为一个整体进行处理,而是直接引用过去了,结果导致计算结果出错。

三、优化建议

在代码“LOD_TP_0.`LOD_8AB699CEB93538` + LOD_TP_1.`LOD_926F669A54CB6C` - LOD_TP_2.`LOD_F08CAF0E524E3E`”两边加上括号,再运行结果正常。

在quick bi数据集中,将字段“购买卷烟中购买非烟的比例=[同时购买卷烟和非烟订单数量]/[卷烟订单数量]”,更改为“购买卷烟中购买非烟的比例=([同时购买卷烟和非烟订单数量])/[卷烟订单数量]”,再执行计算,结果正常。

四、总结

在Quick BI新引用自建计算字段去新建字段时,最好在引用的自建字段两边加个括号。

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小崔2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值