2014-03-07 158 views
0

我已经尝试过IsNull,Case语句和在线搜索,但由于某种原因,如果没有记录被发现它仍然不显示记录或用'0'代替它我试图从表格中获取所有类型并显示在日期范围内已完成了多少项。IsNull没有返回0在SQL查询

这是我的代码到目前为止。

SELECT  ISNULL(COUNT(Type), 0) AS Total, Type 
FROM   dbo.Refs 
WHERE  (DateSubmitted BETWEEN CONVERT(DATETIME, '2014-02-01 00:00:00', 102) AND CONVERT(DATETIME, '2015-01-01 00:00:00', 102)) 
GROUP BY Type 

类型列是unfortunaltey

感谢

+1

如果没有找到记录则没有什么为ISNULL,凯斯等被应用到。 –

回答

2

一个varchar如果您有存储你的类型的表,你可以使用:

SELECT COUNT(r.Type) AS Total, t.Type 
FROM TypeTable t 
     LEFT JOIN dbo.Refs r 
      ON r.Type = t.Type 
      AND r.DateSubmitted >= CONVERT(DATETIME, '2014-02-01 00:00:00', 102) 
      AND r.DateSubmitted <= CONVERT(DATETIME, '2015-01-01 00:00:00', 102) 
GROUP BY t.Type; 

否则,你将需要使用您现有的表格以获取所有类型的列表,然后加入到按日期过滤的表格中:

SELECT COUNT(r.Type) AS Total, t.Type 
FROM (SELECT DISTINCT Type FROM dbo.Refs) t 
     LEFT JOIN dbo.Refs r 
      ON r.Type = t.Type 
      AND r.DateSubmitted >= CONVERT(DATETIME, '2014-02-01 00:00:00', 102) 
      AND r.DateSubmitted <= CONVERT(DATETIME, '2015-01-01 00:00:00', 102) 
GROUP BY t.Type; 

另外,您可以使用:

SELECT COUNT(CASE WHEN r.DateSubmitted >= CONVERT(DATETIME, '2014-02-01 00:00:00', 102) 
         AND r.DateSubmitted <= CONVERT(DATETIME, '2015-01-01 00:00:00', 102) 
        THEN 1 
       END) AS Total, 
     t.Type 
FROM dbo.Refs r 
GROUP BY r.Type; 

最好的方法将取决于您的索引/如果你这样做,或者没有一个表来存储所有类型。

+0

用于将WHERE部分包含在连接条件中 –

+0

感谢您的回应。恐怕没有查找表,所以它可以选择你选择的选项2和3。虽然当我尝试运行第二块SQL时,出现以下错误? '。'附近的语法错误。 – Adamsk1

+0

我错过了子查询中的'FROM'!令人震惊!我现在纠正了它,所以它现在应该运行。 – GarethD