【问题标题】:Do I need to perform a Join in order to merge multiple columns with 0 in them我是否需要执行 Join 才能合并多个包含 0 的列
【发布时间】:2021-03-18 18:17:23
【问题描述】:

我可能问错了这个问题,但我有以下查询,我试图为给定商店提取 3 个不同的指标。当我拉它们时,结果如下:

有没有一种方法可以获得所有这些,以便生成、发布和每日百分比都在一条线上?我希望它看起来像这样

这是我使用的查询:

SELECT
                        STORE_NUM,                  
                        --REPORT_TYPE,      
                        REPORT_STARTDATE,       
                        --GEN_IMPORT_DT,        
                        --POST_IMPORT_DT,       
                        --SID,      
                        --REQ,
                    
                        CASE WHEN REPORT_TYPE = 'G' THEN SE_PCNT ELSE 0 END AS SE_PCNT_Generated,
                        CASE WHEN REPORT_TYPE = 'A' THEN SE_PCNT ELSE 0 END AS SE_PCNT_At_Post,
                        CASE WHEN REPORT_TYPE = 'D' THEN SE_PCNT ELSE 0 END AS SE_PCNT_Daily
            FROM (
            
            SELECT  STORE_NUM,                  
                    REPORT_TYPE,        
                    REPORT_STARTDATE,       
                    DATE_IMPORT_2 AS GEN_IMPORT_DT,     
                    DATE_IMPORT_3 AS POST_IMPORT_DT,        
                    SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) AS SID,       
                    SUM (COVERAGE_EFFECTIVE_REQUIRED) AS REQ,       
                    CASE WHEN SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND)>0 THEN      
                            SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) / SUM(COVERAGE_EFFECTIVE_REQUIRED) ELSE 0 END AS SE_PCNT                      
            FROM DNA_DM..STOREOPS_SCHEDULE_EFFECTIVENESS_RPT                
            WHERE
            --REPORT_TYPE = 'A' AND REC_TYPE = 'S'              
            REPORT_STARTDATE >='03/08/21'
            AND STORE_NUM = 2
            GROUP BY 1, 2, 3, 4, 5  
            
            ) AS q

【问题讨论】:

    标签: sql aginity


    【解决方案1】:

    只需在每个 CASE WHEN 周围添加一个 SUM(..) 并在 q 之后添加一个 GROUP BY STORE_NUM, REPORT_STARTDATE

    ps;您不需要 ELSE 0 - 如果您省略它,那么当前承载 0 的行将改为 NULL; NULL 不参与聚合,因此当 group by 执行“将 3 行压缩为 1”的工作时,可以更轻松地使用 MAX 而不是 SUM 来“获取列中唯一的非空值”

    因此,对于未来,我推荐更通用的模式:

    SELECT 
      x, y,
      MAX(CASE WHEN ... THEN ... END) as ... --do not use ELSE here!
    FROM
      ...
    GROUP BY
      x, y
    

    这种形式的查询适用于 CASE WHEN 选择字符串、日期或其他无法求和的东西的情况(它适用于像你这样的情况,如果它只是一列中的一个数值空值) - 总而言之,它比使用 SUM(CASE WHEN ... THEN ... ELSE 0 END) 更灵活

    【讨论】:

      【解决方案2】:
      SELECT
                              STORE_NUM,                  
                              max(REPORT_STARTDATE),                               
                              max(CASE WHEN REPORT_TYPE = 'G' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_Generated,
                              max(CASE WHEN REPORT_TYPE = 'A' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_At_Post,
                              max(CASE WHEN REPORT_TYPE = 'D' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_Daily
                  FROM (
                  
                  SELECT  STORE_NUM,                  
                          REPORT_TYPE,        
                          REPORT_STARTDATE,       
                          DATE_IMPORT_2 AS GEN_IMPORT_DT,     
                          DATE_IMPORT_3 AS POST_IMPORT_DT,        
                          SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) AS SID,       
                          SUM (COVERAGE_EFFECTIVE_REQUIRED) AS REQ,       
                          CASE WHEN SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND)>0 THEN      
                                  SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) / SUM(COVERAGE_EFFECTIVE_REQUIRED) ELSE 0 END AS SE_PCNT                      
                  FROM DNA_DM..STOREOPS_SCHEDULE_EFFECTIVENESS_RPT                
                  WHERE
                  --REPORT_TYPE = 'A' AND REC_TYPE = 'S'              
                  REPORT_STARTDATE >='03/08/21'
                  AND STORE_NUM = 2
                  GROUP BY 1, 2, 3, 4, 5  
                  
                  ) AS q
      group by store_num
      

      如果您希望 SE_PCNT_Generated、SE_PCNT_At_Post 和 SE_PCNT_Daily 的值明智地存储并明智地报告日期,请使用:

      SELECT
                                  STORE_NUM,                  
                                  REPORT_STARTDATE,                               
                                  max(CASE WHEN REPORT_TYPE = 'G' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_Generated,
                                  max(CASE WHEN REPORT_TYPE = 'A' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_At_Post,
                                  max(CASE WHEN REPORT_TYPE = 'D' THEN SE_PCNT ELSE 0 END )AS SE_PCNT_Daily
                      FROM (
                      
                      SELECT  STORE_NUM,                  
                              REPORT_TYPE,        
                              REPORT_STARTDATE,       
                              DATE_IMPORT_2 AS GEN_IMPORT_DT,     
                              DATE_IMPORT_3 AS POST_IMPORT_DT,        
                              SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) AS SID,       
                              SUM (COVERAGE_EFFECTIVE_REQUIRED) AS REQ,       
                              CASE WHEN SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND)>0 THEN      
                                      SUM (COVERAGE_EFFECTIVE_SCHED_DEMAND) / SUM(COVERAGE_EFFECTIVE_REQUIRED) ELSE 0 END AS SE_PCNT                      
                      FROM DNA_DM..STOREOPS_SCHEDULE_EFFECTIVENESS_RPT                
                      WHERE
                      --REPORT_TYPE = 'A' AND REC_TYPE = 'S'              
                      REPORT_STARTDATE >='03/08/21'
                      AND STORE_NUM = 2
                      GROUP BY 1, 2, 3, 4, 5  
                      
                      ) AS q
          group by store_num,REPORT_STARTDATE
      

      【讨论】:

      • 这正是我所需要的,但它只返回 3/29 的最大日期,我需要报告的日期,所以在这种情况下是 3/08/2021
      • 请尝试第二个查询。
      • 是的,就是这样,感谢您的帮助!
      • 不客气。由于我们使用的是 max ,因此您可以根据需要省略 else 0。如果对您有帮助,请接受此答案。
      • 我会记下 else 0 以备将来使用。你介意解释一下为什么在 Case When's 上使用 Max 吗?另外,答案被接受了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多