2017-05-26 51 views
0

我想从表中选择公司ID,日期和号码,但是这个查询并没有显示一些月份有一些公司的号码为0。如何选择每个月甚至他们没有价值

下面是查询:

SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00' 
GROUP BY c.id, date 

一些这样4 16_12结果2 4 17_01 4 4 17_04 2 4 17_05的2 而不17_03(3月)。它怎么能用0显示17_03?

+0

您能否提供相关表格的模式以及样本数据和预期输出? –

+0

我有三个表,公司(ID 1,名称A/ID 2,名称A/ID 3,名称C),编辑(ID 1,发送ID 1,创建2017-01-01/ID2,send_id4,创建了2017-02 -01/id3,send_id6,created2017-02-22)和send(id1,company_id1,created2017-01-01/id2,company_id1,created2017-02-02/id3,company_id 1,created2017-05-01/id4,company_id 1,创建了2017-01-01/id5,company_id2,created2016-12-01/id6,company_id2,created2017-02-22) –

+0

当我添加评论时,格式发生了变化,希望你能明白我的意思。对于编辑过的表格,公司可能每个月都没有数据,我不确定发送表格是否包含每个月的数据。我如何选择每个月的值,如果没有任何价值的月份,它可以显示:2017-04 0(这是单元格计数列。) –

回答

0

如果您的连接不符合ON子句中的值,则不会返回元组,因此您不会计算行数。如果你有一个固定的企业和日期,你可以手动设置你的价值观与UNION声明:

(SELECT 'company_name1', 'date1', COUNT(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00') 
UNION 

(SELECT 'company_name2', 'date2', COUNT(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00') 

#and make this for companies that not will return zero at count 
UNION 
(SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00' 
GROUP BY c.id, date) 
0
SELECT c.id 
    , ym.y 
    , ym.m 
    , count(e.created) cnt 
    FROM (SELECT @startDate := date_add(@startDate, interval 1 month) date 
       , year(@startDate) y 
       , month(@startDate) m 
      FROM HugeTable 
      JOIN (SELECT @startDate := '2016-11-01' 
         , @endDate := '2017-05-01' 
       ) months 
      WHERE @startDate < @endDate 
     ) ym 
    LEFT JOIN edited e 
     ON year(e.created) = ym.y 
     AND month(e.created) = ym.m 
    LEFT JOIN company c 
     ON c.id = e.company_id 
    GROUP BY ym.y 
     , ym.m 
     , c.id 

HugeTable可以有足够的记录数月数的任何表显示。

+0

感谢您的回答。巨大的表应该有每个记录,但我没有这样的表。有没有其他的查询可以工作? –

+0

只需**编辑**作为巨大的表,它会没事的。我猜。 – Sal

+0

在某些情况下,拥有一个日期表并不疯狂,因为可以比运行中创建行更高效。检查[this](https://stackoverflow.com/questions/14105018/generating-a-series-of-dates)。 – Sal