Maison > base de données > tutoriel mysql > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-06 05:55:02
original
715 Les gens l'ont consulté

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' ) )
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!