2012-11-09 36 views
3

我是一个相对的新手,我一直在与此搏斗太久 - 所以请任何人都可以帮忙!mysql报告每日查询按类型过滤,包括丢失的分组行

我有一个表接受不同类型开发的查询(dev_enquiry),我正在创建一个动态图表来显示每个开发每天有多少个查询。我加入了包含日期列的日历表,以便在没有查询时可以得到0个值。

此SQL给我我想要的东西,但其所有的发展

SELECT calendar.datefield AS DATE, COUNT(de_id) AS enquiries 
FROM  `calendar` 
LEFT JOIN dev_enquiry ON DATE(dev_enquiry.de_date_created) = calendar.datefield) 
WHERE  calendar.datefield BETWEEN (
             SELECT MIN(DATE(de_date_created)) 
             FROM dev_enquiry 
            ) 
     AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry) 
GROUP BY DATE 
ORDER BY DATE DESC 

2012-11-08  3 
2012-11-07  0 
2012-11-06  2 
2012-11-05  1 
2012-11-04  3 

我想式的发展,以筛选出的结果,但仍保留空值时,有上没有查询那个特定的发展日。

以下过滤器的结果,但并没有给我的空值:

SELECT cal.datefield AS DATE, COUNT(t.de_id) AS enquiries 
    FROM (
SELECT * FROM dev_enquiry as d LEFT JOIN calendar as c ON (DATE(d.de_date_created) = c.datefield) 
WHERE  d.de_dev_name = 'Green') as t 
LEFT JOIN calendar as cal ON (cal.datefield = DATE(t.de_date_created)) 
WHERE (cal.datefield BETWEEN (SELECT MIN(DATE(t.de_date_created)) 
FROM dev_enquiry) AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry)) 
GROUP BY DATE ORDER BY DATE DESC 


2012-11-08  1 
2012-11-06  2 
2012-11-05  1 
2012-11-04  1 

结果2012-11-07在这里失踪

+1

不错的第一个问题。欢迎来到堆栈溢出! –

回答

1

也许我误解了这个问题,为什么不在第一个查询示例的左连接中添加一个AND de_dev_Name = 'Green'

SELECT calendar.datefield AS d, COUNT(dev_enquiry.de_id) AS enquiries 
FROM  calendar 
LEFT JOIN dev_enquiry ON (dev_enquiry.de_date_created = calendar.datefield AND de_dev_name = 'Green') 
WHERE  calendar.datefield BETWEEN 
      (SELECT MIN(DATE(de_date_created)) FROM dev_enquiry) 
     AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry) 
GROUP BY d 
ORDER BY d DESC 
+0

辉煌 - 作品一种享受 - 我尝试过类似的东西,但没有放在括号内,因此不断出现错误。非常感谢 –

2

诀窍与领导查询完成日历表和左侧加入不完整(缺少某些日子)汇总表。还请注意IFNULL将(空)结果转换为零。

 SELECT cal.datefield AS date, 
      IFNULL(s.enquiries, 0) AS enquiries 
     FROM calendar as cal 
    LEFT JOIN (
      SELECT count(*) enquiries, 
        de_date_created 
      FROM dev_enquiry 
      WHERE de_dev_name = 'Green' 
     GROUP BY de_date_created 
     ) s on s.de_date_created = cal.datefield 
    WHERE cal.datefield 
      BETWEEN (SELECT MIN(de_date_created) FROM dev_enquiry) 
       AND (SELECT MAX(de_date_created) FROM dev_enquiry) 
    ORDER BY datefield DESC 

这是一个SQL小提琴。 http://sqlfiddle.com/#!2/2db68/12/0

+0

嗨Ollie - 感谢您的快速响应和链接。 - 它在sqlfiddle链接中效果很好,但是当放入我的模式时,它会重复多个日期行而不是添加它们 - 可能是mysql的事情?再次感谢 –