Sql 如何使用查询获取月累计数据
当我运行这个查询时,它应该在DAY列210301、201302和SUM下显示3行结果。但由于某些原因,它只在DAY列下显示SUM行。其想法是,“201301”行在1月份累计31天的数据。 有人能告诉我他们为什么不来吗Sql 如何使用查询获取月累计数据,sql,oracle,Sql,Oracle,当我运行这个查询时,它应该在DAY列210301、201302和SUM下显示3行结果。但由于某些原因,它只在DAY列下显示SUM行。其想法是,“201301”行在1月份累计31天的数据。 有人能告诉我他们为什么不来吗 SELECT X.* FROM ( SELECT (CASE WHEN DAY.DAY = 'SUM' THEN DAY.DAY
SELECT X.*
FROM
(
SELECT
(CASE
WHEN DAY.DAY = 'SUM' THEN DAY.DAY
ELSE
TO_CHAR (TO_DATE (DAY.DAY, 'YYYY-MM'), 'YYYYMM')
END
) AS DAY,
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(ADD_MONTHS(TO_DATE('201301','YYYYMM'),LEVEL-1), 'YYYYMM') AS DAY
FROM DUAL
CONNECT BY ADD_MONTHS(TO_DATE('201301','YYYYMM'),LEVEL-1 ) <= TO_DATE('201302', 'YYYYMM')
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('201301', 'YYYY-MM'), 'YYYYMM') AND TO_CHAR(TO_DATE('201311', 'YYYY-MM'), '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
/* MNOTE */
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('201301', 'YYYY-MM'), 'YYYYMM') AND TO_CHAR(TO_DATE('201306', 'YYYY-MM'), 'YYYYMM')
GROUP BY ROLLUP(COMM_DT)
) MNOT ON DAY.DAY = MNOT.COMM_DT
) X
WHERE 1=1
and X.TOT_CNT IS NOT NULL
这可能是因为总和字段TOT_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
到
nvlMNOT.SUM_STD_CNT,0+nvlRSC.MOVIE_500K,0+nvlRSC.MOVIE_1M,0+nvlRSC.MOVIE,0+nvlRSC.EXAM,0+nvlRSC.WEB,0+nvlRSC.IMG,0+nvlRSC.INTERRAC,0+nvlRSC.DOC,0+AS TOT_CNT
然后尝试然后在DAY.DAY='SUM'然后DAY.DAY上显示ora-00937没有单个组函数如何修复此问题?抱歉,请删除聚合函数并重试。nvlMNOT.SUM_STD_CNT,0+nvlRSC.MOVIE_500K,0+nvlRSC.MOVIE_1M,0+nvlRSC.MOVIE,0+nvlRSC.EXAM,0+nvlRSC.WEB,0+nvlRSC.IMG,0+nvlRSC.INTERRAC,0+nvlRSC.DOC,0+AS TOT_CNTI刚刚尝试过,它确实显示了“201301”和“201302”谢谢!但是,我仍然没有得到列下的数据;“201301”和“201302”的MNOT、MOVIEW、MOVIEW、EXAME、WEB、IMG、INTERACTIVE、DOC“SUM”行显示数据,但其他两行不显示数据。你能帮我做这个吗?如果您不检查数据,我将非常感谢您的帮助,您无法说出为什么该条件不返回任何值。请检查位置条件PKG_SNO!=0和RSC_SNO=0,并且TO_CHARTO_DATE'201301'、'YYYY-MM'、'yyyyymm'和TO_CHARTO_DATE'201306'、'yyyyy-MM'、'yyyyyymm'之间的COMM_DT将返回'201301'和'201302'的一些值。如果没有示例数据、当前和所需结果以及表结构的描述,您的问题将无法得到答案。你让读者对你应该首先提供的信息做额外的猜测工作。