I have a query that I was asked to create that would retrieve a list of all future rent obligations. Everything was going (more or less) ok until I realised that certain results were being double-counted. The way my query is structured it works ok provided the rent starts at the beginning of one month and ends at the end of another month (or, put another way, the rent obligation does not start and end in the same month). I have racked my brain to find a solution that I am sure is not nearly as difficult as I am making it out to be and am coming up empty at the moment. Any thoughts would be greatly appreciated. My code is below and I can provide any clarification that may be needed. Thanks! (I should also point out that the joined view (V_NON_EST_OBLIGS) is a view that returns all obligations that are not estimated.)
------------------------------------------------------------------------------------------------------------------------
"I am not young enough to know everything."
Oscar Wilde (1854-1900)
Code:
SELECT D.doc_id, (SELECT MIN(dist_cd) FROM T_PRPTY JOIN T_PRPTY_DOC ON T_PRPTY.prpty_id = T_PRPTY_DOC.prpty_id
WHERE T_PRPTY_DOC.doc_id = D.doc_id) AS dist_cd, DT.doc_ty_desc,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 1)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 1 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 1))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Jan,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 2)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 2 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 2))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Feb,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 3)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 3 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 3))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Mar,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 4)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 4 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 4))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Apr,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 5)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 5 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 5))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS May,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 6)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 6 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 6))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Jun,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 7)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 7 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 7))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Jul,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 8)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 8 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 8))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Aug,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 9)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 9 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 9))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Sep,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 10)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 10 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 10))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Oct,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 11)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 11 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 11))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Nov,
ISNULL(SUM((CASE WHEN YEAR(O1.cmnc_dt) < YEAR(GETDATE()) + 1 AND (YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 12)
OR (YEAR(O1.cmnc_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.cmnc_dt) <= 12 AND
(YEAR(O1.expr_dt) > YEAR(GETDATE()) + 1
OR YEAR(O1.expr_dt) = YEAR(GETDATE()) + 1 AND MONTH(O1.expr_dt) >= 12))
THEN O1.per_perd_amt/O1.perd_lngth_qty END)),0) AS Dec
FROM T_DOC D
JOIN T_DOC_TY DT ON D.doc_ty_cd = DT.doc_ty_cd
LEFT JOIN V_ALL_NON_EST_OBLIGS O1
ON O1.doc_id = D.doc_id AND O1.oblig_cls_cd = 'Rent' AND O1.acct_cd = '000000'
------------------------------------------------------------------------------------------------------------------------
"I am not young enough to know everything."
Oscar Wilde (1854-1900)