0
votes

Requête SQL pour sélectionner 14 mois précédents où ajouter le montant "0" si un mois manque

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. xxx

 Entrez la description de l'image ici

Vous pouvez afficher à partir des résultats, que nov 2018 est manquant. < / p>


10 commentaires

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 va donner une date de renouvellement arbitraire des données de chaque mois. Vous voulez probablement utiliser min () ou max ().


Votre dtsubscriptrenewaldate> = 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.


4 Réponses :


0
votes

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;


1 commentaires

ça ne va pas commander les mois sans données correctement



0
votes

Essayez de générer une date de calendrier et faites le rejoindre xxx


0 commentaires

0
votes

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). XXX

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.


0 commentaires

0
votes

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;


0 commentaires