How to display all the dates in the date-range having group by dates? Suppose I have a table called “products”:

Productive product-name   product-quantity  created-date
111            ABC          10               1/10/2018
222            XYZ          20               1/10/2018
333            PQR          30               1/11/2018
444            MNC          40               1/15/2018
555            DEF          50               1/11/2018


If I run this query:

Select convert(date,createddate,101), count(product-quantity) from products
Where created-date &gt; 1/9/2018 and created-date &lt; 1/16/1018
group by convert(date,createddate,101)


Which will give me output such as

created-date.  product-quantity
1/10/2018            30
1/11/2018            80
1/15/2018            40


I want to achieve:

created-date.  product-quantity
1/10/2018            30
1/11/2018            80
1/12/2018            00
1/13/2018            00
1/14/2018            00
1/15/2018            40


How can I do it?
A basic implementation of a Calendar table.




CREATE TABLE Calendar(cDate datetime, cDay int, cDayOfWeek int, cDayName varchar(20));

DECLARE @date date = '20180101';
WHILE @date &lt;= '20180131'
BEGIN
    INSERT INTO Calendar VALUES (@date, DAY(@date), DATEPART(weekday, @date), DATENAME(weekday, @date));
    SET @date = DATEADD(day, 1, @date);
END
GO



31 rows affected






CREATE TABLE products(Productive int, Name char(3), Qty int, Created date);
INSERT INTO products VALUES
(111, 'ABC', 10, '1/10/2018'),
(222, 'XYZ', 20, '1/10/2018'),
(333, 'PQR', 30, '1/11/2018'),
(444, 'MNC', 40, '1/15/2018'),
(555, 'DEF', 50, '1/11/2018');
GO



5 rows affected



Notice I've used a LEFT JOIN to get all records from calendar table and only those records that match on products table.




SELECT     c.cDate AS Created, COALESCE(Qty, 0) AS Qty
FROM       Calendar c
LEFT JOIN  (SELECT   CONVERT(date, Created, 101) AS [Created],
                     COUNT(Qty) AS [Qty]
            FROM     products
            GROUP BY CONVERT(date, Created, 101)) p
ON         p.Created = c.cDate
WHERE      c.cDate &gt;= (SELECT MIN(Created) FROM products)
AND        c.cDate &lt;= (SELECT MAX(Created) FROM products);
GO



Created             | Qty
:------------------ | --:
10/01/2018 00:00:00 |   2
11/01/2018 00:00:00 |   2
12/01/2018 00:00:00 |   0
13/01/2018 00:00:00 |   0
14/01/2018 00:00:00 |   0
15/01/2018 00:00:00 |   1



dbfiddle here