Maison  >  Article  >  base de données  >  Comment obtenir des enregistrements mensuels à partir d’une base de données même lorsque des données sont manquantes ?

Comment obtenir des enregistrements mensuels à partir d’une base de données même lorsque des données sont manquantes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-06 05:55:02716parcourir

How to Get Month-Wise Records from a Database Even When Data is Missing?

Obtention d'enregistrements mensuels dans une base de données, même lorsque des données sont manquantes

Dans les systèmes de gestion de bases de données, il est souvent nécessaire d'extraire des enregistrements mensuels d'une table. Cependant, des défis surviennent lorsqu’il manque des points de données pour certains mois. Cet article aborde ce problème en présentant une solution pour générer une liste complète de mois et récupérer les données correspondantes, même si les valeurs sont absentes.

La requête d'origine que vous avez fournie :

SELECT COUNT( `userID` ) AS total, DATE_FORMAT( `userRegistredDate` , '%b' ) AS MONTH , YEAR( `userRegistredDate` ) AS year
FROM `users`
GROUP BY DATE_FORMAT( FROM_UNIXTIME( `userRegistredDate` , '%b' ) )

fournit le résultat souhaité, mais seulement pendant des mois avec des données existantes. Pour gérer les mois manquants, nous utilisons une table avec une liste complète des mois et la joignons à la table utilisateur :

SELECT COUNT(u.userID) AS total, m.month
FROM (
    SELECT 'Jan' AS MONTH
    UNION SELECT 'Feb' AS MONTH
    UNION SELECT 'Mar' AS MONTH
    UNION SELECT 'Apr' AS MONTH
    UNION SELECT 'May' AS MONTH
    UNION SELECT 'Jun' AS MONTH
    UNION SELECT 'Jul' AS MONTH
    UNION SELECT 'Aug' AS MONTH
    UNION SELECT 'Sep' AS MONTH
    UNION SELECT 'Oct' AS MONTH
    UNION SELECT 'Nov' AS MONTH
    UNION SELECT 'Dec' AS MONTH
) AS m
LEFT JOIN users u 
ON MONTH(STR_TO_DATE(CONCAT(m.month, ' 2013'),'%M %Y')) = MONTH(u.userRegistredDate)
AND YEAR(u.userRegistredDate) = '2013'
GROUP BY m.month
ORDER BY 1+1;

Cette table d'union garantit que tous les mois sont représentés, permettant un ensemble de résultats complet. Une approche alternative qui simplifie la requête est présentée ci-dessous :

SELECT COUNT(u.userID) AS total, DATE_FORMAT(merge_date,'%b') AS month, YEAR(m.merge_date) AS year
FROM (
    SELECT '2013-01-01' AS merge_date
    UNION SELECT '2013-02-01' AS merge_date
    UNION SELECT '2013-03-01' AS merge_date
    UNION SELECT '2013-04-01' AS merge_date
    UNION SELECT '2013-05-01' AS merge_date
    UNION SELECT '2013-06-01' AS merge_date
    UNION SELECT '2013-07-01' AS merge_date
    UNION SELECT '2013-08-01' AS merge_date
    UNION SELECT '2013-09-01' AS merge_date
    UNION SELECT '2013-10-01' AS merge_date
    UNION SELECT '2013-11-01' AS merge_date
    UNION SELECT '2013-12-01' AS merge_date
) AS m
LEFT JOIN users u 
ON MONTH(m.merge_date) = MONTH(u.userRegistredDate)
AND YEAR(m.merge_date) = YEAR(u.userRegistredDate)
GROUP BY m.merge_date
ORDER BY 1+1;

Cette requête modifiée utilise une union de dates pour représenter la plage mensuelle complète. Les deux méthodes atteignent l'objectif de générer un enregistrement mensuel, même en l'absence de données pour tous les mois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn