【问题标题】:MYSQL - Join 3 tables Grouping By Month Including Empty MonthsMYSQL - 加入 3 个按月份分组的表,包括空月份
【发布时间】:2016-12-13 22:10:16
【问题描述】:

我有 3 个表:T_AUDITS、T_MONTHS 和 T_REGIONS。

我正在尝试按月份和区域获取“审核”分组的数量,包括当月不存在审核时为零。

我的查询只获取有审计的月份。我无法获得 0 次审核的月份。

SELECT 
 MON.MON_DESC,
 REG.REG_ID,
 COUNT(AUD.AUD_ID) 
FROM
 T_MONTHS MON 
 LEFT JOIN T_AUDITS AUD 
   ON (
     MON.MON_ID = MONTH(AUD.AUD_START_DATE)
   ) 
   RIGHT JOIN T_REGIONS REG 
   ON (
     REG.REG_ID = AUD.AUD_REGION
   )  
GROUP BY    MON.MON_ID, REG.REG_ID
ORDER BY REG.REG_ID,
 MON.MON_ID

我明白了:

MON_NAME  |REG_ID        |COUNT(AUD.AUD_ID) |
----------|--------------|------------------|
January   |AMERICA       |52                |
February  |AMERICA       |51                |
March     |AMERICA       |57                |
April     |AMERICA       |66                |
May       |AMERICA       |54                |
January   |ASIA          |58                |
February  |ASIA          |29                |
April     |ASIA          |71                |
May       |EUROPE        |59                |

我想得到:

MON_NAME  |REG_ID        |COUNT(AUD.AUD_ID) |
----------|--------------|------------------|
January   |AMERICA       |52                |
February  |AMERICA       |51                |
March     |AMERICA       |57                |
April     |AMERICA       |66                |
May       |AMERICA       |54                |
January   |ASIA          |58                |
February  |ASIA          |29                |
March     |ASIA          |0                 |
April     |ASIA          |59                |
May       |ASIA          |0                 |
January   |EUROPE        |0                 |
February  |EUROPE        |0                 |
March     |EUROPE        |0                 |
April     |EUROPE        |0                 |
May       |EUROPE        |79                |

有什么想法吗?提前谢谢!!!

【问题讨论】:

  • 根据我自己的经验,我实际上更喜欢创建一个以每行为一个月的静态表。在此表上JOIN 比尝试执行逻辑以包含不属于联接数据的月份要容易得多(也更有效)。您可以在此表上JOIN 并将NULL(无记录)替换为0
  • 我建议COALESCE(),但我不知道没有AUD_REGION,你将如何获得REG_ID
  • @Santi 这不就是T_MONTHS 吗?
  • @Barmar Doh。读得不够仔细。 CROSS JOIN的好建议

标签: mysql sql select join group-by


【解决方案1】:

尝试使用CROSS JOIN 获取所有月份和地区组合,然后使用LEFT JOIN 获取审计。

SELECT 
 MON.MON_DESC,
 REG.REG_ID,
 IFNULL(COUNT(AUD.AUD_ID), 0) AS count
FROM T_MONTHS MON 
CROSS JOIN T_REGIONS REG
LEFT JOIN T_AUDIT AUD ON MONTH(AUD.AUD_START_DATE) = MON.MON_ID AND REG.REG_ID = AUD.AUD_REGION
GROUP BY REG.REG_ID, MON.MON_ID
ORDER BY REG.REG_ID, MON.MON_ID

【讨论】:

  • 它有效!!.. 非常感谢,我以前从未使用过交叉连接。你刚刚给我上了很好的一课。
猜你喜欢
  • 2017-10-29
  • 2012-06-26
  • 2011-12-21
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
相关资源
最近更新 更多