recherche

Maison  >  Questions et réponses  >  le corps du texte

Définir la valeur par défaut pour l'intervalle de connexion MySQL, année et mois

Il y a un problème avec ma requête. J'ai deux tables et je souhaite les rejoindre pour obtenir des résultats basés sur la clé primaire de la première table, mais il me manque 1 donnée de la première table.

C'est mon violon

Comme vous pouvez le voir, il me manque "xx3" pour le mois 1

J'ai essayé de changer les connexions gauche et droite mais toujours le même résultat. Comme vous pouvez le voir, je dois définir coalesce(sum(b.sd_qty),0) 设置为总计, 如果没有 qty,则将 0 sur la valeur par défaut.

P粉924915787P粉924915787278 Il y a quelques jours332

répondre à tous(1)je répondrai

  • P粉287726308

    P粉2877263082024-02-26 09:49:06

    Vous devez également rejoindre la table à différentes dates :

    SELECT a.item_code,
           COALESCE(SUM(b.sd_qty), 0) total,
           DATE_FORMAT(d.sd_date, '%m-%Y') month_year
    FROM item a 
    CROSS JOIN (
      SELECT DISTINCT sd_date 
      FROM sales_details 
      WHERE sd_date >= '2020-04-01' - INTERVAL 3 MONTH AND sd_date < '2020-05-01'
    ) d 
    LEFT JOIN sales_details b 
    ON a.item_code = b.item_code AND b.sd_date = d.sd_date
    GROUP BY month_year, a.item_code
    ORDER BY month_year, a.item_code;

    Alternativement, pour MySql 8.0+, utilisez un CTE récursif pour renvoyer les dates de début de tous les mois pour lesquels vous souhaitez le résultat, qui peuvent être joints au tableau :

    WITH RECURSIVE dates AS (
      SELECT '2020-04-01' - INTERVAL 3 MONTH AS sd_date
      UNION ALL
      SELECT sd_date + INTERVAL 1 MONTH
      FROM dates 
      WHERE sd_date + INTERVAL 1 MONTH < '2020-05-01'
    )
    SELECT a.item_code,
           COALESCE(SUM(b.sd_qty), 0) total,
           DATE_FORMAT(d.sd_date, '%m-%Y') month_year
    FROM item a CROSS JOIN dates d 
    LEFT JOIN sales_details b 
    ON a.item_code = b.item_code AND DATE_FORMAT(b.sd_date, '%m-%Y') = DATE_FORMAT(d.sd_date, '%m-%Y')
    GROUP BY month_year, a.item_code
    ORDER BY month_year, a.item_code;

    Voir la Démo.

    répondre
    0
  • Annulerrépondre