2013-07-04 2 views
0

Прошу прощения за такой длинный запрос, но мне отчаянно нужна помощь. Когда я запускаю запрос ниже, я получаю ежедневные данные. Но я хочу ежемесячные данные, используя LASTDAY, SUM, GROUP BY. Например, если я выбрал '20130501' в # startDt # и '20130701' в # endDt #, он должен дать мне 3 ряда накопленных результатов; Май, июнь и июль. Может ли кто-нибудь помочь?Как получить накопленные данные с использованием функции SUM, GROUP BY

SELECT X.* 
FROM 
     ( 
     SELECT 
        (CASE 
          WHEN DAY.DAY = 'SUM' THEN DAY.DAY 
          ELSE TO_CHAR (TO_DATE (DAY.DAY, 'YYYY-MM-DD'), 'YYYYMMDD') 
         END 
        ) AS DAY, 
        DAY.WEEK, 
        MNOT.SUM_STD_CNT AS MNOT_CNT, 
        RSC.MOVIE_500K AS MOVIE_500K_CNT, 
        RSC.MOVIE_1M AS MOVIE_1M_CNT, 
        RSC.MOVIE AS MOVIE_CNT, 
        RSC.EXAM AS EXAM_CNT, 
        RSC.WEB AS WEB_CNT, 
        RSC.IMG AS IMG_CNT, 
        RSC.INTERRAC AS INTERRACTIVE_CNT, 
        RSC.DOC AS DOC_CNT, 
        MNOT.SUM_STD_CNT + RSC.MOVIE_500K + RSC.MOVIE_1M + RSC.MOVIE + RSC.EXAM + RSC.WEB + RSC.IMG + RSC.INTERRAC + RSC.DOC TOT_CNT 
      FROM 
        /* DATES */ 
        (SELECT 
           TO_CHAR (TO_DATE (#startDt#,'YYYY-MM-DD')+LEVEL- 1, 'YYYYMMDD') AS DAY 

         FROM DUAL 
         CONNECT BY TO_DATE(#startDt#, 'YYYY-MM-DD') + LEVEL - 1 <![CDATA[<=]]> TO_DATE(#endDt#, 'YYYY-MM-DD') 
         UNION ALL 
         SELECT 'SUM', '' FROM DUAL 
        ) DAY LEFT OUTER JOIN 
        /* RESOURCE */ 
        (
        SELECT 
           NVL(DT_G.COMM_DT, 'SUM') COMM_DT 
           ,NVL(SUM(DT_G.MOVIE_500K), 0) AS MOVIE_500K 
           ,NVL(SUM(DT_G.MOVIE_1M), 0) AS MOVIE_1M 
           ,NVL(SUM(DT_G.MOVIE), 0) AS MOVIE 
           ,NVL(SUM(DT_G.EXAM), 0) AS EXAM 
           ,NVL(SUM(DT_G.DOC), 0) AS DOC 
           ,NVL(SUM(DT_G.IMG), 0) AS IMG 
           ,NVL(SUM(DT_G.WEB), 0) AS WEB 
           ,NVL(SUM(DT_G.INTERRAC), 0) AS INTERRAC 
         FROM 
           (
           SELECT 
               COMM_DT 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_500K END MOVIE_500K 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_1M END AS MOVIE_1M 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_500K+SUMT.SUM_1M END AS MOVIE 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP11' THEN SUMT.SUM_STD_CNT END AS EXAM 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP12' THEN SUMT.SUM_STD_CNT END AS DOC 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP13' THEN SUMT.SUM_STD_CNT END AS IMG 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP14' THEN SUMT.SUM_STD_CNT END AS WEB 
              , CASE SUMT.RSC_TP_DSCD WHEN 'RTP01' THEN SUMT.SUM_STD_CNT END AS INTERRAC 
            FROM (
               SELECT RSC_TP_DSCD, SUM(STDY_CNT) AS SUM_STD_CNT, SUM(MOVIE_STDY_CNT_N1M) AS SUM_1M, SUM(MOVIE_STDY_CNT_N500K) AS SUM_500K, COMM_DT 
               FROM (
                 SELECT RSC_SNO, STDY_CNT, MOVIE_STDY_CNT_N1M, MOVIE_STDY_CNT_N500K, COMM_DT 
                  FROM LRMS.V_EBSM_PKG_RSC_COMM_CNT 
                 WHERE PKG_SNO = 0 AND RSC_SNO != 0 
                 AND COMM_DT BETWEEN TO_CHAR(TO_DATE(#startDt#, 'YYYY-MM-DD'), 'YYYYMMDD') AND TO_CHAR(TO_DATE(#endDt#, 'YYYY-MM-DD'), 'YYYYMMDD') 
                 ) CNT 
                LEFT OUTER JOIN LRMS.V_LRRM_RSC RSC ON CNT.RSC_SNO = RSC.RSC_SNO 
               GROUP BY RSC_TP_DSCD, COMM_DT 
              ) SUMT 
           ) DT_G 
         GROUP BY ROLLUP(DT_G.COMM_DT) 
        ) RSC ON DAY.DAY = RSC.COMM_DT 

        LEFT OUTER JOIN 
        (
         SELECT NVL(SUM(STDY_CNT), 0) AS SUM_STD_CNT, NVL(COMM_DT, 'SUM') COMM_DT 
         FROM LRMS.V_EBSM_PKG_RSC_COMM_CNT 
         WHERE PKG_SNO != 0 AND RSC_SNO = 0 
           AND COMM_DT BETWEEN TO_CHAR(TO_DATE(#startDt#, 'YYYY-MM-DD'), 'YYYYMMDD') AND TO_CHAR(TO_DATE(#endDt#, 'YYYY-MM-DD'), 'YYYYMMDD') 
         GROUP BY ROLLUP(COMM_DT) 
        ) MNOT ON DAY.DAY = MNOT.COMM_DT 
     ) X 

WHERE 1=1 
and X.TOT_CNT IS NOT NULL 

ответ

1

вы можете сделать что-то вроде

SELECT DATENAME(MONTH , DAY) , SUM(COLUMN1) , SUM(COLUMN2) .. 
FROM (YOURQUERY) AS A 
GROUP BY DATENAME(MONTH , DAY) 

Я думаю, что это поможет.

+0

скажите мне, что это такое? Я могу помочь тебе больше. –

+0

Цените свою помощь, спасибо. Но мне интересно несколько вещей. 1) весь запрос идет в «YOURQUERY»? 2) Что входит в DATENAME (MONTH, DAY), так как мои параметры: # startDt # и # endDt # – user2470075

+0

1. Если вы хотите применить группу по результату вашего мудрого запроса, тогда вы должны поместить весь свой запрос. 2. Вы создали одно имя столбца «день». Я применяю функцию месяца и применяю группу. так что результат будет месяц мудрым и применить сумму на другой столбец. –