Sql 计数不返回0

Sql 计数不返回0,sql,oracle,Sql,Oracle,我有一个表,其中我必须为每个月恢复将要上课的组数,该检查必须每三个月进行一次,最终输出应为: Gruppi A nel mese di Luglio 20 Gruppi A nel mese di Agosto 18 Gruppi A nel mese di Settembre 5 Gruppi B nel mese di Luglio 8 Gruppi B nel mese di Agosto 0 Gruppi B nel mese di Setembre 12

我有一个表,其中我必须为每个月恢复将要上课的组数,该检查必须每三个月进行一次,最终输出应为:

Gruppi A nel mese di Luglio    20
Gruppi A nel mese di Agosto    18
Gruppi A nel mese di Settembre  5
Gruppi B nel mese di Luglio     8
Gruppi B nel mese di Agosto     0
Gruppi B nel mese di Setembre  12
这是我的疑问:

WITH T AS (
  SELECT GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(REVIEW.REVIEW_DATE, 'Month') AS FORMAT_MONTH,
         COUNT(*) AS COUNT_GROUPS
  FROM REVIEW 
    INNER JOIN GROUPS ON REVIEW.ID = GROUPS.ID
  WHERE GROUP_TYPE = 1
   AND GROUP_MASTER = 50
   AND TO_CHAR(REVIEW.REVIEW_DATE, 'YYYYMM') 
         IN ((SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 0), 'YYYYMM') FROM DUAL), 
             (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 1), 'YYYYMM') FROM DUAL), (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 2), 'YYYYMM') FROM DUAL))
  GROUP BY GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(REVIEW.REVIEW_DATE, 'Month')

  UNION ALL

  SELECT GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(REVIEW.REVIEW_DATE, 'Month') AS FORMAT_MONTH,
         COUNT(*) AS COUNT_GROUPS
  FROM REVIEW 
     INNER JOIN GROUPS ON REVIEW.ID = GROUPS.ID
  WHERE GROUP_TYPE = 1
    AND GROUP_MASTER = 50
    AND TO_CHAR(REVIEW.REVIEW_DATE, 'YYYYMM') IN ((SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 0), 'YYYYMM') FROM DUAL), 
                                                  (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 1), 'YYYYMM') FROM DUAL), 
                                                  (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20160701', 'YYYYMMDD'), 2), 'YYYYMM') FROM DUAL))
  GROUP BY GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(REVIEW.REVIEW_DATE, 'Month')
) 
SELECT * 
FROM T 
UNION ALL 
SELECT 'Gruppi nel periodo', SUM(COUNT_GROUPS) 
FROM T;

我想你可以这样重写你的问题

如果你想看到没有评论的小组,你应该离开加入。 为什么使用相等参数两次获取数据?我将其从查询中删除 对于总计,您可以使用分组汇总 IMHO/您可以使用truncdate.“mm”按月份比较日期 编辑:将检查审核日期移动到加入条件。 我假设GROUP_TYPE和GROUP_MASTER属于我的代码如下所示的组:

WITH T AS (
  SELECT 
     GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(d.REVIEW_DATE, 'Month')  AS FORMAT_MONTH,
     COUNT(REVIEW.ID) AS COUNT_GROUPS
  FROM GROUPS 
       JOIN (SELECT add_months(TO_DATE('20160701', 'YYYYMMDD'),0) as REVIEW_DATE from DUAL UNION ALL 
             SELECT add_months(TO_DATE('20160701', 'YYYYMMDD'),1) from DUAL UNION ALL 
             SELECT add_months(TO_DATE('20160701', 'YYYYMMDD'),2) from DUAL ) d ON 1=1
       LEFT JOIN REVIEW ON REVIEW.ID = GROUPS.ID AND trunc(REVIEW.REVIEW_DATE, 'MM') = d.REVIEW_DATE
  WHERE GROUP_TYPE = 1
   AND GROUP_MASTER = 50
  GROUP BY rollup(GROUPS.GROUP_NAME || ' nel mese di ' || TO_CHAR(d.REVIEW_DATE, 'Month'))
  ) 
  SELECT  nvl(FORMAT_MONTH,'Gruppi nel periodo') as FORMAT_MONTH
          ,COUNT_GROUPS 
  FROM T ;

不相关,但:不需要为IN值选择。您可以将其简化为:在to_CHARADD_months to_DATE'20160701','YYYYMMDD',0','YYYYMM'。。。。该表达式可以进一步简化为一个简单的表达式:其中review.review\u日期介于日期“2016-07-01”和日期“2016-07-01”之间,2请发布一组简化后的数据,以获得所需的结果。在这里,我们知道你需要什么,但不知道你从哪里开始。另外,您的查询有什么问题?这是一个错误吗?错误的结果?可以非常有用,而不是给我“Gruppi nel mese di Agosto 0”,它不会显示该行,因为where与结果不匹配。您可能只需要一个左外部联接而不是内部联接。还有,为什么联盟会这样?我想你把NVL放错地方了在里面是的,谢谢。另一方面,我要补充几点。