【发布时间】: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