伯爵没有回报0

时间:2016-10-17 09:32:37

标签: 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

这是我的疑问:

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;

1 个答案:

答案 0 :(得分:0)

我想你可能会改写你的查询。

  1. 如果您想要查看没有REVIEW的群组,您应该离开加入。
  2. 为什么用相同的参数获取数据两次(我从查询中删除它)
  3. 总计您可以使用rollup()
  4. 分组
  5. 恕我直言/您可以使用trunc(日期。' mm')来比较日期和月份
  6. 编辑:将检查审核日期移至加入条件。
  7. 我认为 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 ;