2016-10-17 54 views
-1

我有一張桌子,我必須每個月收回要上課的小組的計數,這個檢查必須每三個月進行一次,最終輸出應該是這樣的:計數不會退回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

無關,而是:在'select'爲'IN'值是沒有必要的。您可以簡化爲:IN(TO_CHAR(ADD_MONTHS(TO_DATE('20160701','YYYYMMDD'),0),'YYYYMM'),...')。該表達式可以進一步簡化爲一個簡單的方法:'在日期'2016-07-01'和日期add_months('2016-07-01',2)' –

+0

之間review.review_date請發佈一組縮減的數據, 。在這裏,我們知道你需要什麼,但不知道你從哪裏開始。另外,你的查詢有什麼問題?它是否給出錯誤?錯誤的結果? [mcve]可以是非常有用的 – Aleksej

+0

而不是給我'Gruppi nel mese di Agosto 0'它不會顯示該行,因爲與結果不匹配 – Chrix1387

回答

0

我想你可能重寫查詢這樣的。

  1. 如果你想查看沒有REVIEW的組,你應該加左連接。
  2. 爲什麼你用等PARAM獲取數據的兩倍(從我的查詢刪除)
  3. 對於總您可以通過彙總()使用組
  4. 恕我直言/您可以使用TRUNC(date.'mm')爲按月份比較日期
  5. 編輯:移動支票審查日期以加入條件。

我認爲GROUP_TYPEGROUP_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(..)'是錯的 –