Oracle 填补累积查询中的空白
我有以下查询来计算累计金额:Oracle 填补累积查询中的空白,oracle,Oracle,我有以下查询来计算累计金额: SELECT to_char(INVC_DT, 'MON-YYYY') AS MONTH, SUM(INVC_AMT), SUM(SUM(INVC_AMT)) OVER (ORDER BY MIN(INVC_DT)) FROM T_INVC_INFO I INNER JOIN T_TASK_INFO T ON I.TASK_ID = T.TASK_ID WHERE T.CNTRCT_ID = #session.user.cntrct_id
SELECT to_char(INVC_DT, 'MON-YYYY') AS MONTH,
SUM(INVC_AMT),
SUM(SUM(INVC_AMT)) OVER (ORDER BY MIN(INVC_DT))
FROM T_INVC_INFO I INNER JOIN T_TASK_INFO T ON I.TASK_ID = T.TASK_ID
WHERE T.CNTRCT_ID = #session.user.cntrct_id#
GROUP BY to_char(INVC_DT, 'MON-YYYY')
ORDER BY MONTH DESC;
我的问题是我需要及时填补这些空白。例如,如果我有1月、2月和4月的数据,我需要另一个值为0的MAR行。您可以在查询中引入一个日历表,它将表示您希望在输出中显示的每个月/年。假设您希望覆盖2017年至2019年的所有时间,您可以尝试:
WITH years AS (
SELECT '2017' AS year FROM dual UNION ALL
SELECT '2018' FROM dual UNION ALL
SELECT '2019' FROM dual
),
months AS (
SELECT 'JAN' AS month FROM dual UNION ALL
SELECT 'FEB' FROM dual UNION ALL
...
SELECT 'DEC' FROM dual
)
SELECT
m.month || '-' || y.year AS MONTH,
SUM(INVC_AMT),
SUM(SUM(INVC_AMT)) OVER (ORDER BY MIN(INVC_DT))
FROM years y
CROSS JOIN months m
LEFT JOIN T_INVC_INFO i
ON m.month || '-' || y.year = TO_CHAR(i.INVC_DT, 'MON-YYYY')
LEFT JOIN T_TASK_INFO t
ON i.TASK_ID = t.TASK_ID AND
t.CNTRCT_ID = #session.user.cntrct_id#
WHERE
TO_DATE(m.month || '-' || y.year, 'MON-YYYY') BETWEEN
(SELECT MIN(INVC_DT) FROM T_INVC_INFO) AND
(SELECT MAX(INVC_DT) FROM T_INVC_INFO)
GROUP BY
m.month || '-' || y.year
ORDER BY
MONTH DESC;
有没有办法通过传入参数或通过计算表中的最小值和最大值使其成为动态的?@alanfcm I更新了我的问题,部分满足了您的要求。现在,查询的
WHERE
子句将来自日历表的日期限制在最小和最大发票日期之间。除此之外,您可能还需要使用动态SQL(例如存储过程)。根据您自己的请求,我的答案现在只涉及发票日期的范围。这些空月份是否超出此范围?不,它们在范围内。请尝试更新的答案。我将对合同ID的限制移动到join的on
子句中。