【问题标题】:Avoiding columns from groupby clause避免 groupby 子句中的列
【发布时间】:2018-12-04 12:40:56
【问题描述】:

这里我需要避免 group by 子句中的这 2 列,它返回的记录数与我的预期值相比更多。

实际上来自st.cnt 的查询结果返回了 3 条记录,但是当我们以SP 运行时,我得到了预期的两倍。

st_cnt.COUNT_FILES,
st_cnt.COUNT_SCANS,

SELECT table1.DA_SEC,
  table1.DA_REG,
  table1.PROJ,
  table1.SOL,
  table1.SCAN_YEAR_MON,
  to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'YYYY'),
  to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'MM'),
  COUNT(DISTINCT table1.ISSUE_ID),
  COUNT(DISTINCT table1.USERNAME),
  COUNT(DISTINCT table1.PATH),
  st_cnt.COUNT_FILES,
  st_cnt.COUNT_SCANS,
  sum(unq_Pro.HIGH_CNT),
  sum(unq_Pro.MEDIUM_CNT),
  sum(unq_Pro.LOW_CNT),
  sum(SUPPR_HIGH) - sum(UNSUPPR_HIGH),
  sum(SUPPR_MEDIUM) - sum(UNSUPPR_MEDIUM),
  sum(SUPPR_LOW) - sum(UNSUPPR_LOW),
  CURRENT_DATE
FROM table1
JOIN
  (SELECT PROJ, SOL, SCAN_YEAR, SCAN_MONTH, COUNT(DISTINCT PATH) COUNT_FILES, COUNT(DISTINCT SCAN_ID) COUNT_SCANS FROM table2 GROUP BY PROJ, SOL, SCAN_YEAR, SCAN_MONTH) st_cnt
ON st_cnt.PROJ = table1.PROJ--AND st_cnt.SOL = table1.SOL
GROUP BY table1.DA_SEC, table1.DA_REG, table1.PROJ, table1.SOL, table1.SCAN_YEAR_MON, st_cnt.COUNT_FILES, st_cnt.COUNT_SCAN;

【问题讨论】:

    标签: mysql sql plsql


    【解决方案1】:

    大量时间使用 With Clause 在这些类型的场景中非常有用。这是讨论 With 子句的 ask tom 线程 Ask Tom Link 也是使用 with 子句的子查询分解的有用链接Sub Query Factoring

    它还有助于我们了解在这种情况下表 1 的数据是什么样的,以便我们可以测试答案。但是有了你分享的信息,这样的东西可以帮助你

    WITH TAB1_DATA AS (
    SELECT table1.DA_SEC,
     table1.DA_REG,
     table1.PROJ,
     table1.SOL,
     table1.SCAN_YEAR_MON,
     to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'YYYY'),
     to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'MM'),
    COUNT(DISTINCT table1.ISSUE_ID),
    COUNT(DISTINCT table1.USERNAME),
    COUNT(DISTINCT table1.PATH),
    sum(unq_Pro.HIGH_CNT),
    sum(unq_Pro.MEDIUM_CNT),
    sum(unq_Pro.LOW_CNT),
    sum(SUPPR_HIGH) - sum(UNSUPPR_HIGH),
    sum(SUPPR_MEDIUM) - sum(UNSUPPR_MEDIUM),
    sum(SUPPR_LOW) - sum(UNSUPPR_LOW),
    CURRENT_DATE
      FROM table1
    GROUP BY table1.DA_SEC, table1.DA_REG, table1.PROJ, table1.SOL, table1.SCAN_YEAR_MON
    )
     SELECT TD.* ,  st_cnt.COUNT_FILES,st_cnt.COUNT_SCANS FROM TAB1_DATA TD ,
    (SELECT PROJ, SOL, SCAN_YEAR, SCAN_MONTH, COUNT(DISTINCT PATH) COUNT_FILES, 
    COUNT(DISTINCT SCAN_ID) COUNT_SCANS FROM table2 GROUP BY PROJ, SOL, SCAN_YEAR, 
    SCAN_MONTH) st_cnt
    WHERE st_cnt.PROJ = TD.PROJ;
    

    【讨论】:

    • 记录仍在拆分为更多计数
    • 另外,它是一个存储过程,我们将在其中插入目标表。我们如何在存储过程中引用带有“WITH”子句的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多