我有一张桌子,我必须每个月恢复将要上课的小组的数量,这项检查必须每三个月进行一次,最终输出应为:
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;
答案 0 :(得分:0)
我想你可能会改写你的查询。
我认为 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 ;