【问题标题】:SQL Query group bySQL 查询分组依据
【发布时间】:2011-06-22 18:38:09
【问题描述】:

粘贴了当前用于从 unix shell 脚本生成报告的 sql 查询。我想在下面的 sql 查询中添加一个附加列 COUNT (cdw.file_id) writeoffcnt,它显示 匹配 mg_disp_status=0 和 mig_disp_code =3 的记录计数。 现有字段 COUNT (cdw.file_id) cnt 应该有匹配的记录数 mg_disp_status = 1 和 mig_disp_code 2. 如何修改查询?

 SELECT fs.file_id,
                 fs.file_id_serv,
                 fs.file_process_dt,
                 fs.file_name,
                 fs.total_records,
                 RTRIM (d.description_text) source,
                 SUM(amount),
                 COUNT (cdw.file_id) cnt
            FROM file_status fs,
                 dr_data_work cdw,
                 descriptions d,
                 contacts ec
           WHERE file_process_dt >= TO_DATE ('${START_DATE}', 'DD-MON-YYYY')
                 AND  file_process_dt < TO_DATE ('${END_DATE}', 'DD-MON-YYYY')
                 AND fs.ext_contact_id = ec.ext_contact_id
                 --
                 AND ec.description_code = d.description_code
                 AND cdw.file_id = fs.file_id
                 AND mg_disp_status = 1
                 AND mig_disp_code <> 2
        GROUP BY fs.file_id,
                 fs.file_id_serv,
                 fs.file_process_dt,
                 fs.file_name,
                 fs.total_records,
                 RTRIM (d.description_text);

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    我不完全理解您的所有要求排列,但应该可以使用以下方法:

    SELECT
    .
    .
    .
    SUM(CASE mg_disp_status=0 and mig_disp_code =3 THEN 1 ELSE 0 END) cnt1,
    SUM(CASE mg_disp_status=1 and mig_disp_code <> 2 THEN 1 ELSE 0 END) cnt2,
    

    【讨论】:

      【解决方案2】:

      使用不同的别名加入两次并计算:

      SELECT fs.file_id,
                   fs.file_id_serv,
                   fs.file_process_dt,
                   fs.file_name,
                   fs.total_records,
                   RTRIM (d.description_text) source,
                   SUM(amount),
                   COUNT (cdw.file_id) cnt1, COUNT (cdw2.file_id) cnt2
              FROM file_status fs,
                   dr_data_work cdw, dr_data_work cdw2,
                   descriptions d,
                   contacts ec
             WHERE file_process_dt >= TO_DATE ('${START_DATE}', 'DD-MON-YYYY')
                   AND  file_process_dt < TO_DATE ('${END_DATE}', 'DD-MON-YYYY')
                   AND fs.ext_contact_id = ec.ext_contact_id
                   --
                   AND ec.description_code = d.description_code
                   AND cdw.file_id = fs.file_id AND cdw2.file_id = fs.file_id
                   AND cdw.mg_disp_status = 1 AND cdw2.mg_disp_status = 0 
                   AND cdw.mig_disp_code <> 2 AND cdw2.mg_disp_code = 3
      
      
      
          GROUP BY fs.file_id,
                   fs.file_id_serv,
                   fs.file_process_dt,
                   fs.file_name,
                   fs.total_records,
                   RTRIM (d.description_text);
      

      【讨论】:

      • 非常感谢您提供的信息。我可以有 3 种类型的场景。 dr_data_work 表中可能存在 cdw.mg_disp_status = 1 AND cdw.mig_disp_code 2 for file_id 112 的单个记录。此外,可能会有两个或多个记录具有两种类型(cdw.mg_disp_status = 1 AND cdw .mig_disp_code 2 ) (cdw.mg_disp_status = 0 AND cdw.mig_disp_code =3) 或单独用于另一个文件 id 113 。另一种情况是文件 ID 114 的 dr_data_work 表 (cdw.mg_disp_status = 0 AND cdw.mig_disp_code =3) 中可能存在一条记录。不确定此查询是否处理此问题。
      • 有没有人可以帮帮我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多