【问题标题】:how to select every month even they do not have value [duplicate]即使它们没有价值,如何选择每个月[重复]
【发布时间】:2017-10-27 18:16:06
【问题描述】:

我想从表中选择公司 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(三月)。它怎么能用 0 显示 17_03 ?

【问题讨论】:

  • 能否提供相关表的架构以及示例数据和预期输出?
  • 我有三个表,company(id 1,name a / id 2,name a / id 3,name c),edited(id 1,send_id 1,created 2017-01-01/id2 ,send_id4,created 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,created2017-02-01/ id5,company_id2,created2016-12-01/ id6,company_id2,created2017-02-22)
  • 我添加评论时格式改变了,希望你能明白我的意思。对于已编辑的表,公司可能没有每个月的数据,我不确定发送表是否包含每个月的数据。如何选择每个月的值,对于没有值的月份,它可以显示:2017-04 0(这是计数列下的单元格。)

标签: mysql sql


【解决方案1】:

如果您的联接根据其在 ON 子句中的值不匹配,则 not 将返回元组,因此您不会计算行数。如果您有一组固定的公司和日期,您可以使用 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)

【讨论】:

    【解决方案2】:
    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 可以是任何记录数足以显示月数的表。

    【讨论】:

    • 感谢您的回答。巨大的表应该有每条记录,但我没有这样的表。有没有其他查询可以工作?
    • 只要使用 edited 作为 HugeTable 就可以了。我的猜测。
    • 在某些情况下,拥有一个日期表并不疯狂,因为它可能比动态创建行更高效。检查this
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2019-03-07
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多