2017-03-15 75 views
-1

我有合格的风险,描述和创建日期,谁附加到风险的子类别,这最后一个附加到风险类别,每个风险有一个名称,如“风险1”我的目标是根据过去3个月的名称和风险类别来计算风险的数量。如何获得计数(*)返回0

我有这样的SQL请求:

SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk 
JOIN risk_subcategory on risk_subcategory.id = risk.risk_subcategory_id 
    JOIN risk_category on risk_category.id = risk_subcategory.risk_category_id 
where risk.creation_date >= (NOW()-INTERVAL 3 MONTH) GROUP BY MONTH(risk.creation_date), risk_category.name; 

它返回这个结果集:

 month number risk_name 
--------------------------- 
     12  1  Risk 1 
     12  3  Risk 2 
     1  1  Risk 3 
     1  9  Risk 2 
     2  1  Risk 3 
     2  1  Risk 1 
     2  10  Risk 2 

我想这个结果(包括0):

month number risk_name 
--------------------------- 
    12 1  Risk 1 
    12 3  Risk 2 
    12 0  Risk 3 
    1 0  Risk 1 
    1 1  Risk 3 
    1 9  Risk 2 
    2 1  Risk 3 
    2 1  Risk 1 
    2 10  Risk 2 

我该怎么办? 感谢

+4

使用左外连接。 –

+0

谢谢你,但它不会改变结果集。 –

+0

我认为你需要使用Inner Join来获得左右组合 –

回答

0

根据投票的答案,我已尝试但不起作用:

SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk 
    JOIN risk_subcategory on risk_subcategory.id = risk.risk_subcategory_id 
    JOIN risk_category on risk_category.id = risk_subcategory.risk_category_id 
LEFT JOIN (
    SELECT mois 
    FROM 
     (
     SELECT 1 AS mois 
     UNION SELECT 2 AS mois 
     UNION SELECT 3 AS mois 
     UNION SELECT 4 AS mois 
     UNION SELECT 5 AS mois 
     UNION SELECT 6 AS mois 
     UNION SELECT 7 AS mois 
     UNION SELECT 8 AS mois 
     UNION SELECT 9 AS mois 
     UNION SELECT 10 AS mois 
     UNION SELECT 11 AS mois 
     UNION SELECT 12 AS mois 
    ) as year 
    ) as months on months.mois = MONTH(risk.creation_date) 
where risk.creation_date >= (NOW()-INTERVAL 3 MONTH) GROUP BY MONTH(risk.creation_date), risk_category.name; 
+2

将'LEFT JOIN'改为'RIGHT JOIN'以使其工作。现在您从{risk,risk_subcategory,risk_category}开始,然后用您的派生表'year'加入它。您也可以从派生表“year”开始,然后根据{risk,risk_subcategory,risk_category}进行LEFT JOIN。 – eremmel

+0

结果相同 –

+0

您需要在SELECT和GROUP BY中将'MONTH(risk.creation_date)'替换为'months.mois',那么您使用的月表作为查询的基础(借口不完整)。 – eremmel

3

您从您执行count同桌选择一个月,所以如果月x计数应该是0就意味着有与一个月= X没有行。你不能从那张桌子那个月开始,因为它根本就不在那里。

如果你想获得的所有的几个月里,你应该使用另一个表,你拥有所有的几个月内,并执行该表和risk之间的left join,像

select t1.month, coalesce(t2.count(*), 0)), t2.risk_name 
from months t1 
left join 
     risk t2 
on  t1.month = MONTH(risk.creation_date) 
group by t1.month, t2.risk_name 
+0

请在发送答案之前阅读我的问题,从创建日期字段中提取月份风险表 –

+0

不需要粗鲁,请仔细阅读我的答案,如果不够清楚,请进一步解释。我阅读了这个问题,我的回答是有效的,你不能在查询表中显示几个月不存在的查询。 –

+0

我已经提供了我的sql请求,如果有什么问题请告诉它或给我提供另一个sql请求与我的给定的表,我不能接受谁应得到评论,而不是在答案的一般答案 –