J'ai créé cette requête pour sélectionner la date, le montant des 14 mois précédents, dans ce cas, le mois est manquant si aucun enregistrement n'est présent pour ce mois, veuillez me suggérer une solution pour ajouter zéro et mois si ce mois de pare-caticulaire est manquant. Vous pouvez afficher à partir des résultats, que nov 2018 est manquant. P> < / p>
4 Réponses :
Vous pouvez d'abord générer les mois et l'année, puis peut-il laisser rejoindre celui-ci avec votre requête -
SELECT dtSubscriptionRenewalDate, DATE_FORMAT(dtSubscriptionRenewalDate, "%b %Y") AS month, SUM(intPaymentAmount) as total FROM (SELECT 'January' AS months UNION SELECT 'February' UNION SELECT 'March' UNION SELECT 'April' UNION SELECT 'May' UNION SELECT 'June' UNION SELECT 'July' UNION SELECT 'August' UNION SELECT 'September' UNION SELECT 'October' UNION SELECT 'November' UNION SELECT 'December') month CROSS JOIN (SELECT 2018 AS years UNION SELECT 2019 UNION SELECT 2020) year LEFT JOIN `tbl_pi_payment` tp ON YEAR(tp.dtSubscriptionRenewalDate) = year.years AND MONTH(tp.dtSubscriptionRenewalDate) = month.months WHERE strCurrencyCode = 'USD' and dtSubscriptionRenewalDate <= NOW() and dtSubscriptionRenewalDate >= Date_add(Now(),interval - 14 month) group by month ORDER BY `tbl_pi_payment`.`dtSubscriptionRenewalDate` ASC;
ça ne va pas commander les mois sans données correctement
Essayez de générer une date de calendrier et faites le rejoindre code>
Créer une table ad-hoc avec sélection / union des mois possibles, puis rejoignez votre table à partir de celle-ci, sélectionnez uniquement les enregistrements du mois donné. Pour plus de commodité, calculez la plage de dates du nombre de mois il y a des mois (mais vous pouvez simplement utiliser les expressions les plus compliquées pour la date de début et la date de fin dans la jointure à la place). Cela signalera null En tant que date de renouvellement pendant des mois sans enregistrement, et la date de renouvellement minimale trouvée pendant des mois qui ont des enregistrements. Je ne sais pas ce que vous voulez exactement là-bas. P> p>
pour Oracle comme ceci:
SELECT md.month AS month, SUM(intPaymentAmount) as total FROM `tbl_pi_payment` , (select add_month(trunc(sysdate,'MM')-level) month from dual connect by level <15) md WHERE strCurrencyCode = 'USD' trunc(dtSubscriptionRenewalDate,'MM')(+)=md.month group by md.month ORDER BY md.month ASC;
Vous avez des données pour nov. 2018?
Non, il n'y a pas de dossier dans la table pour nov. 2018
Ce cas, comment vous attendez-vous à la ligne de novembre 2018 dans la sortie? Si vous avez besoin de tout le mois disponible entre votre date de début et de fin, vous devez utiliser une table de calendrier ou vous pouvez générer la liste de mois dans une autre requête, puis rejoindre votre requête principale.
S'il vous plaît pouvez-vous me laisser savoir comment est-ce fait?
Créez un tableau de tous les mois et laissez-vous rejoindre votre requête.
Mysql ou mariadb? Et quelle version?
Sa mysql. Version 5.6.45
Votre
Sélectionnez DTSUBScriptionRenewaldate code> va donner une date de renouvellement arbitraire des données de chaque mois. Vous voulez probablement utiliser min () ou max ().
Votre
dtsubscriptrenewaldate> = code> Si la condition, si elle est exécutée aujourd'hui, trouverait des enregistrements pour octobre 2018, mais ne comprennent pas ceux du 1er octobre 5 (celles-ci un peu plus de 14 mois). Est-ce que c'est ce que tu veux? Ou souhaitez-vous sélectionner des données pour des mois entiers (sauf pour le mois en cours)?
Je veux sélectionner tout le mois sauf le mois en cours.