有关Quick BI中Case子句中多次使用lod函数返回空值问题分析

一、Quick BI中的lod_ include函数

lod_ include {维度1[,维度2]...:聚合表达式[:过滤条件]}

作用:将表达式中的维度一起作为分组依据进行订算。其中,

1)    维度1[,维度2]... :声明维度,指定聚合表达式要连接到的一个或多个维度。使用逗号分隔各个维度。

2)    聚合表达式:聚合表达式是所执行的计算,用于定义目标维度。

3)    过滤条件:可以通过对前面的声明维度设定条件进行过滤,非必须。

二、、问题描述

3月

4月

5月

合计

总结存数量

35116176

36286140

37120427

108522743

Quick BI数据集新建计算字段” 总结存数量=CASE WHEN MAX([月份])='3月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='3月'}  WHEN MAX([月份])='4月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='4月'}  WHEN MAX([月份])='5月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='5月'} 。

END”

有关Quick BI中Case子句中多次使用lod函数返回空值问题分析_第1张图片

在Quick BI仪表板新建交叉表,以‘月份’为行,以‘总结存数量’为列,执行结果“数据返回为空“,这个结果显示不正确。

有关Quick BI中Case子句中多次使用lod函数返回空值问题分析_第2张图片

三、问题分析

查看SQL代码

SELECT

  LOD_TM.`LOD_2C07D23FC7BBAA` AS LOD_0,

  CASE

    WHEN LOD_TM.`temp_calculation_0` = '3月' THEN LOD_TP_0.`LOD_C5682C34D69BEC`

    WHEN LOD_TM.`temp_calculation_0` = '4月' THEN LOD_TP_1.`LOD_D78F97D23AEDC1`

    WHEN LOD_TM.`temp_calculation_0` = '5月' THEN LOD_TP_2.`LOD_5B3771E3CF7947`

  END AS LOD_1

FROM

  (

    SELECT

      ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA,

      MAX(ATN_T_1_.`月份`) AS temp_calculation_0

    FROM

      `terminaldata2`.`account` AS ATN_T_1_

    GROUP BY

      ATN_T_1_.`月份`

    ORDER BY

      LOD_2C07D23FC7BBAA ASC

    LIMIT

      0, 20

  ) AS LOD_TM

  INNER JOIN (

    SELECT

      LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

      LOD_TR.`LOD_measure_result` AS LOD_C5682C34D69BEC

    FROM

      (

        SELECT

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        GROUP BY

          ATN_T_1_.`月份`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          SUM(

            ATN_T_1_.`结存数量`

          ) AS LOD_measure_result,

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        WHERE

          ATN_T_1_.`月份` = '3月'

        GROUP BY

          ATN_T_1_.`月份`

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

    GROUP BY

      LOD_TL.`LOD_2C07D23FC7BBAA`

  ) AS LOD_TP_0 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_0.`LOD_2C07D23FC7BBAA`

  INNER JOIN (

    SELECT

      LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

      LOD_TR.`LOD_measure_result` AS LOD_D78F97D23AEDC1

    FROM

      (

        SELECT

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        GROUP BY

          ATN_T_1_.`月份`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          SUM(

            ATN_T_1_.`结存数量`

          ) AS LOD_measure_result,

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        WHERE

          ATN_T_1_.`月份` = '4月'

        GROUP BY

          ATN_T_1_.`月份`

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

    GROUP BY

      LOD_TL.`LOD_2C07D23FC7BBAA`

  ) AS LOD_TP_1 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_1.`LOD_2C07D23FC7BBAA`

  INNER JOIN (

    SELECT

      LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

      LOD_TR.`LOD_measure_result` AS LOD_5B3771E3CF7947

    FROM

      (

        SELECT

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        GROUP BY

          ATN_T_1_.`月份`

      ) AS LOD_TL

      INNER JOIN (

        SELECT

          SUM(

            ATN_T_1_.`结存数量`

          ) AS LOD_measure_result,

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        WHERE

          ATN_T_1_.`月份` = '5月'

        GROUP BY

          ATN_T_1_.`月份`

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

    GROUP BY

      LOD_TL.`LOD_2C07D23FC7BBAA`

  ) AS LOD_TP_2 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_2.`LOD_2C07D23FC7BBAA`



SELECT

  COUNT(1) AS query_count

FROM

  (

    SELECT

      LOD_TM.`LOD_2C07D23FC7BBAA` AS LOD_0,

      CASE

        WHEN LOD_TM.`temp_calculation_0` = '3月' THEN LOD_TP_0.`LOD_C5682C34D69BEC`

        WHEN LOD_TM.`temp_calculation_0` = '4月' THEN LOD_TP_1.`LOD_D78F97D23AEDC1`

        WHEN LOD_TM.`temp_calculation_0` = '5月' THEN LOD_TP_2.`LOD_5B3771E3CF7947`

      END AS LOD_1

    FROM

      (

        SELECT

          ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA,

          MAX(ATN_T_1_.`月份`) AS temp_calculation_0

        FROM

          `terminaldata2`.`account` AS ATN_T_1_

        GROUP BY

          ATN_T_1_.`月份`

      ) AS LOD_TM

      INNER JOIN (

        SELECT

          LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

          LOD_TR.`LOD_measure_result` AS LOD_C5682C34D69BEC

        FROM

          (

            SELECT

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            GROUP BY

              ATN_T_1_.`月份`

          ) AS LOD_TL

          INNER JOIN (

            SELECT

              SUM(

                ATN_T_1_.`结存数量`

              ) AS LOD_measure_result,

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            WHERE

              ATN_T_1_.`月份` = '3月'

            GROUP BY

              ATN_T_1_.`月份`

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

        GROUP BY

          LOD_TL.`LOD_2C07D23FC7BBAA`

      ) AS LOD_TP_0 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_0.`LOD_2C07D23FC7BBAA`

      INNER JOIN (

        SELECT

          LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

          LOD_TR.`LOD_measure_result` AS LOD_D78F97D23AEDC1

        FROM

          (

            SELECT

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            GROUP BY

              ATN_T_1_.`月份`

          ) AS LOD_TL

          INNER JOIN (

            SELECT

              SUM(

                ATN_T_1_.`结存数量`

              ) AS LOD_measure_result,

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            WHERE

              ATN_T_1_.`月份` = '4月'

            GROUP BY

              ATN_T_1_.`月份`

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

        GROUP BY

          LOD_TL.`LOD_2C07D23FC7BBAA`

      ) AS LOD_TP_1 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_1.`LOD_2C07D23FC7BBAA`

      INNER JOIN (

        SELECT

          LOD_TL.`LOD_2C07D23FC7BBAA` AS LOD_2C07D23FC7BBAA,

          LOD_TR.`LOD_measure_result` AS LOD_5B3771E3CF7947

        FROM

          (

            SELECT

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            GROUP BY

              ATN_T_1_.`月份`

          ) AS LOD_TL

          INNER JOIN (

            SELECT

              SUM(

                ATN_T_1_.`结存数量`

              ) AS LOD_measure_result,

              ATN_T_1_.`月份` AS LOD_2C07D23FC7BBAA

            FROM

              `terminaldata2`.`account` AS ATN_T_1_

            WHERE

              ATN_T_1_.`月份` = '5月'

            GROUP BY

              ATN_T_1_.`月份`

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

        GROUP BY

          LOD_TL.`LOD_2C07D23FC7BBAA`

      ) AS LOD_TP_2 ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_2.`LOD_2C07D23FC7BBAA`

  ) AS a

以WHEN MAX([月份])='3月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='3月'}为例分析:

上述代码,中LOD_TM表结果为

LOD_2C07D23FC7BBAA

temp_calculation_0

3月

3月

4月

4月

5月

5月

LOD_TL表结果为

LOD_2C07D23FC7BBAA

3月

4月

5月

LOD_TR表结果为

LOD_measure_result

LOD_2C07D23FC7BBAA

35116176

3月

LOD_TL与LOD_TR通过条件”ON LOD_TL.`LOD_2C07D23FC7BBAA` = LOD_TR.`LOD_2C07D23FC7BBAA`    GROUP BY  LOD_TL.`LOD_2C07D23FC7BBAA`”进行内连接(INNER JOIN)得到表LOD_TP_0,LOD_TP_0结果为:

LOD_2C07D23FC7BBAA

LOD_C5682C34D69BEC

3月

35116176

LOD_TM与LOD_TP_0通过条件“ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_0.`LOD_2C07D23FC7BBAA` “进行内连接(INNER JOIN),得到的结果为(这里称为表A1,由于是内连接,所以4月、5月无法显示):

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_0)

3月

3月

35116176

同理,当“WHEN MAX([月份])='4月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='4月'}“,得到的结果为(这里称为表A2,由于是内连接,所以3月、5月无法显示):

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_1)

4月

4月

36286140

同理,当“WHEN MAX([月份])='5月' THEN lod_include{[月份]:SUM([结存数量]):[月份]='5月'}“,得到的结果为(这里称为表A3,由于是内连接,所以3月、4月无法显示):

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_2)

5月

5月

37120427

表A1、表A2、表A3默认进行通过字段‘LOD_2C07D23FC7BBAA‘进行内连接(INNER JOIN),由于表A1中只有’3月‘,表A2中只有’4月‘,表A3中只有’5月‘,内连接的表必然为空表。

四、优化建议

既然表A1、表A2、表A3之间默认是内连接(INNER JOIN),只需要让表A1、表A2、表A3中同时存在“3月“、”4月“、”5月“即可以。也就是把LOD_TM与LOD_TP_0通过条件“ON LOD_TM.`LOD_2C07D23FC7BBAA` = LOD_TP_0.`LOD_2C07D23FC7BBAA` “进行的内连接(INNER JOIN,改为左外连接(LEFT JOIN)。LOD_TP_1、LOD_TP_2同理进行相同操作。具体做法即将上述第43、101、159、261、319、377行代码由INNER JOIN 改为 LEFT JOIN。这样得到的表A1:

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_0)

3月

3月

35116176

4月

4月

NULL

5月

5月

NULL

表A2:

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_0)

3月

3月

NULL

4月

4月

36286140

5月

5月

NULL

表A3:

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_0)

3月

3月

NULL

4月

4月

NULL

5月

5月

37120427

新得到的表A1、表A2、表A3再进行内连接(INNER JOIN)得到的结果是:

LOD_2C07D23FC7BBAA

temp_calculation_0

LOD_C5682C34D69BEC(LOD_TP_0)

3月

3月

35116176

4月

4月

36286140

5月

5月

37120427

你可能感兴趣的:(Quick,BI,Quick,BI,lod函数,SQL,数据分析,内连接,左外连接)