数据集SQL问题

WITH A AS(

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM( REAL_SALE_AM ) / 10000 DANGTIAN 

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YMD_ID = '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

 ),B AS ( 

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM( REAL_SALE_AM ) / 10000 BENYUE 

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YM_ID = SUBSTR('${YM_ID}',1,7)

  AND YMD_ID <= '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

),C AS (

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM(REAL_SALE_AM ) / 10000 YUELEIJI,

  SUM(BASIC_TASK_SALE_AM) / 10000 AS BASIC_TASK_SALE, 

  SUM(TQ_SALE_AM) / 10000 TONGQI

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YEAR_ID = SUBSTR('${YM_ID}',1,4) 

  AND YMD_ID <= '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

),D AS ( 

    SELECT

        SYB_NAME,

        NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

        SUM(REAL_SALE_AM)/10000 AS NIANDU,

        SUM(BASIC_TASK_SALE_AM)/10000 AS ANNUAL_BASIC_TASK,

        SUM(SPRINT_TASK_SALE_AM)/10000 AS ANNUAL_SPRINT_TASK

    FROM

        ADS_BUSS_PERFORMANCE_KPI_DETAIL T

    WHERE YEAR_ID = SUBSTR('${YM_ID}',1,4)

    GROUP BY 

        SYB_NAME,

        ATT_VALUES01

  )

  SELECT 

  COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME, D.SYB_NAME) AS SYB_NAME,

  A.ATT_VALUES01,

  NVL(A.DANGTIAN,0) DANGTIAN,

  B.BENYUE,

  C.BASIC_TASK_SALE,

  C.YUELEIJI,

  C.TONGQI,

  D.ANNUAL_BASIC_TASK,

  D.ANNUAL_SPRINT_TASK

  FROM A 

    FULL OUTER JOIN B ON A.SYB_NAME = B.SYB_NAME AND A.ATT_VALUES01 = B.ATT_VALUES01

    FULL OUTER JOIN C ON COALESCE(A.SYB_NAME, B.SYB_NAME) = C.SYB_NAME AND A.ATT_VALUES01 = C.ATT_VALUES01

    FULL OUTER JOIN D ON COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME) = D.SYB_NAME AND A.ATT_VALUES01 = D.ATT_VALUES01

WHERE 

    COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME, D.SYB_NAME) = '健康消费品事业部'

数据集二:

、:

WITH A AS(

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM( REAL_SALE_AM ) / 10000 DANGTIAN 

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YMD_ID = '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

 ),B AS ( 

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM( REAL_SALE_AM ) / 10000 BENYUE 

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YM_ID = SUBSTR('${YM_ID}',1,7)

  AND YMD_ID <= '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

),C AS (

SELECT

  SYB_NAME,

  NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

  SUM(REAL_SALE_AM ) / 10000 YUELEIJI,

  SUM(BASIC_TASK_SALE_AM) / 10000 AS BASIC_TASK_SALE, 

  SUM(TQ_SALE_AM) / 10000 TONGQI

FROM

  ADS_BUSS_PERFORMANCE_KPI_DETAIL 

WHERE

  1 = 1 

  AND YEAR_ID = SUBSTR('${YM_ID}',1,4) 

  AND YMD_ID <= '${YM_ID}'

  GROUP BY 

        SYB_NAME,

        ATT_VALUES01

),D AS ( 

    SELECT

        SYB_NAME,

        NVL(ATT_VALUES01,'健康消费品事业部') ATT_VALUES01,

        SUM(REAL_SALE_AM)/10000 AS NIANDU,

        SUM(BASIC_TASK_SALE_AM)/10000 AS ANNUAL_BASIC_TASK,

        SUM(SPRINT_TASK_SALE_AM)/10000 AS ANNUAL_SPRINT_TASK

    FROM

        ADS_BUSS_PERFORMANCE_KPI_DETAIL T

    WHERE YEAR_ID = SUBSTR('${YM_ID}',1,4)

    GROUP BY 

        SYB_NAME,

        ATT_VALUES01

  )

 SELECT 

  COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME, D.SYB_NAME) AS SYB_NAME,

  COALESCE(A.ATT_VALUES01, B.ATT_VALUES01, C.ATT_VALUES01, D.ATT_VALUES01,'1') AS  ATT_VALUES01,

  NVL(A.DANGTIAN,0) DANGTIAN,

  B.BENYUE,

  C.BASIC_TASK_SALE,

  C.YUELEIJI,

  C.TONGQI,

  D.ANNUAL_BASIC_TASK,

  D.ANNUAL_SPRINT_TASK

  FROM A 

    FULL OUTER JOIN B ON A.SYB_NAME = B.SYB_NAME AND A.ATT_VALUES01 = B.ATT_VALUES01

    FULL OUTER JOIN C ON COALESCE(A.SYB_NAME, B.SYB_NAME) = C.SYB_NAME AND COALESCE(A.ATT_VALUES01, B.ATT_VALUES01) = C.ATT_VALUES01

    FULL OUTER JOIN D ON COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME) = D.SYB_NAME AND COALESCE(A.ATT_VALUES01, B.ATT_VALUES01, C.ATT_VALUES01) = D.ATT_VALUES01

WHERE 

    COALESCE(A.SYB_NAME, B.SYB_NAME, C.SYB_NAME, D.SYB_NAME) = '健康消费品事业部'

想问一下第一个数据集和第二个数据集之前有什么区别吗?为什么第一个数据集ATT_VALUES01这个字段在PC端,数据库,数据集预览中都正常展示,但是在移动端展示不出来('${YM_ID}'是日期参数,格式2025-10-10

FineReport 嘘.. 发布于 2025-10-14 15:19 (编辑于 2025-10-14 15:20)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
技术支持--哈哈Lv4初级互助
发布于2025-10-14 15:43

两个数据集(SQL 查询)的核心区别主要体现在ATT_VALUES01 字段的取值逻辑表连接条件中 ATT_VALUES01 的关联方式上,这也是导致移动端展示差异的关键原因。

具体区别分析1. 最终结果中 ATT_VALUES01 的取值逻辑不同
  • 第一个数据集:最终查询的ATT_VALUES01直接取自 A 表的ATT_VALUES01(即A.ATT_VALUES01)。这意味着如果 A 表(当天数据)中没有对应记录(A.ATT_VALUES01为NULL),最终结果的ATT_VALUES01会直接为NULL。

  • 第二个数据集:最终查询的ATT_VALUES01使用COALESCE(A.ATT_VALUES01, B.ATT_VALUES01, C.ATT_VALUES01, D.ATT_VALUES01, '1')取值,逻辑是:优先取 A 表的非空值→若 A 为空则取 B 表→若 B 为空则取 C 表→若 C 为空则取 D 表→若所有表都为空则默认取'1'。这确保了ATT_VALUES01永远不会为NULL。

2. 表连接(JOIN)时 ATT_VALUES01 的关联条件不同
  • 第一个数据集

    • 关联 C 表时,条件为A.ATT_VALUES01 = C.ATT_VALUES01(仅用 A 表的ATT_VALUES01关联)。

    • 关联 D 表时,条件为A.ATT_VALUES01 = D.ATT_VALUES01(仅用 A 表的ATT_VALUES01关联)。若 A 表无数据(A.ATT_VALUES01为NULL),则 C 表和 D 表的关联会失败,导致最终结果中ATT_VALUES01更可能为NULL。

  • 第二个数据集

    • 关联 C 表时,条件为COALESCE(A.ATT_VALUES01, B.ATT_VALUES01) = C.ATT_VALUES01(用 A 或 B 表的非空值关联)。

    • 关联 D 表时,条件为COALESCE(A.ATT_VALUES01, B.ATT_VALUES01, C.ATT_VALUES01) = D.ATT_VALUES01(用 A、B、C 表的非空值关联)。即使 A 表无数据,也能通过 B、C 表的ATT_VALUES01正常关联,避免ATT_VALUES01为NULL。

移动端 ATT_VALUES01 不显示的原因

第一个数据集的ATT_VALUES01依赖于 A 表(当天数据),当以下场景发生时,该字段会变为NULL:

  • 当天(YMD_ID = '${YM_ID}')没有符合条件的销售数据(A 表为空)。

  • 由于 A 表为空,且关联 C、D 表时条件失败,导致最终结果中ATT_VALUES01无有效取值。

而移动端通常对NULL值的处理更严格(例如默认隐藏NULL字段、或前端渲染逻辑不支持NULL值),因此会出现 “不显示” 的现象。

第二个数据集通过COALESCE强制ATT_VALUES01不为NULL,规避了移动端对NULL值的兼容性问题,因此能正常展示。

最佳回答
1
yzm665590Lv3见习互助
发布于2025-10-14 15:29

第一个数据集是 展示字段是 A.ATT_VALUES01, 第二个做了非空处理 COALESCE(A.ATT_VALUES01, B.ATT_VALUES01, C.ATT_VALUES01, D.ATT_VALUES01,'1') AS  ATT_VALUES01,

  • 3关注人数
  • 47浏览人数
  • 最后回答于:2025-10-14 15:43
    请选择关闭问题的原因
    确定 取消
    返回顶部