1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| ;WITH
CTE AS
(
-- Recherche le dernier relevé de compteur par année et mois
SELECT cpt_id
, YEAR(cpt_Horodate) AS cpt_Horodate_year
, MONTH(cpt_Horodate) AS cpt_Horodate_month
, MAX(cpt_Horodate) AS last_cpt_Horodate
FROM dbo.consommation_csm
WHERE cpt_Horodate >= DATEADD(month, -12, CAST(GETDATE() AS date))
GROUP BY cpt_id, YEAR(cpt_Horodate), MONTH(cpt_Horodate)
)
, ANNEE AS
(
-- Récupère la valeur du dernier relevé
SELECT CSM.cpt_id
, C.cpt_Horodate_year
, C.cpt_Horodate_month
, CSM.cpt_valeur
FROM CTE AS C
INNER JOIN dbo.consommation_csm AS CSM
ON C.cpt_id = CSM.cpt_id
AND C.cpt_Horodate_month = MONTH(CSM.cpt_Horodate)
AND C.last_cpt_Horodate = CSM.cpt_Horodate
)
SELECT A.cpt_Horodate_year
, A.cpt_Horodate_month
, SUM(B.cpt_valeur - A.cpt_valeur) AS month_conso
FROM ANNEE AS A
INNER JOIN ANNEE AS B
ON
(
A.cpt_Horodate_year = B.cpt_Horodate_year
AND A.cpt_Horodate_month + 1 = B.cpt_Horodate_month
)
OR
(
-- Gère la consommation à cheval sur deux années
A.cpt_Horodate_year + 1 = B.cpt_Horodate_year
AND A.cpt_Horodate_month = 12
AND B.cpt_Horodate_month = 1
)
GROUP BY A.cpt_Horodate_year, A.cpt_Horodate_month
ORDER BY A.cpt_Horodate_year, A.cpt_Horodate_month |
Partager