2016-10-17 2 views
-1

У меня есть таблица, где я должен ежемесячно восстанавливать количество групп, которые будут брать уроки, эта проверка должна выполняться каждые три месяца, конечный результат должен быть таким:Count не возвращает 0

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

Unrelated, Но: 'select' для' значений в' не является необходимым. Вы можете упростить это: 'IN (TO_CHAR (ADD_MONTHS (TO_DATE ('20160701', 'YYYYMMDD'), 0), 'YYYYMM'), ...'). Это выражение может быть упрощено до простого: 'где review.review_date между датой '2016-07-01' и датой add_months ('2016-07-01', 2)' –

+0

Пожалуйста, разместите уменьшенный набор данных с желаемым результатом , Здесь мы знаем, что вам нужно, но не там, откуда вы начинаете. Кроме того, в чем проблема с вашим запросом? Это ошибка? неправильный результат? [mcve] может быть очень полезным – Aleksej

+0

Вместо того, чтобы давать мне «Gruppi nel mese di Agosto 0», он не отображает эту строку, так как там, где не соответствует результатам – Chrix1387

ответ

0

Я думаю, вы можете переписать запрос, как это.

  1. Если вы хотите видеть группы без РАССМОТРЕНИЯ, вы должны левые присоединиться.
  2. Почему вы получите данные дважды с одинаковыми парами (я удалить его из моего запроса)
  3. Для общего числа вы можете использовать группу по накопительному пакету()
  4. IMHO/Вы можете использовать TRUNC (date.'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 ; 
+0

Я думаю, что у вас есть NVL в неправильном месте – Aleksej

+0

Спасибо. Я починил это. –

+0

'.. = IN (..)' неверно –

Смежные вопросы