「製品」というテーブルがあるとします。
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
このクエリを実行すると:
Select convert(date,createddate,101), count(product-quantity) from products
Where created-date > 1/9/2018 and created-date < 1/16/1018
group by convert(date,createddate,101)
これは私に次のような出力を与えます
created-date. product-quantity
1/10/2018 30
1/11/2018 80
1/15/2018 40
達成したい:
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
どうすればできますか?
Calendarテーブルの基本的な実装。
CREATE TABLE Calendar(cDate datetime, cDay int, cDayOfWeek int, cDayName varchar(20)); DECLARE @date date = '20180101'; WHILE @date <= '20180131' BEGIN INSERT INTO Calendar VALUES (@date, DAY(@date), DATEPART(weekday, @date), DATENAME(weekday, @date)); SET @date = DATEADD(day, 1, @date); END GO
31行が影響を受けました
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行が影響を受けました
LEFT JOINを使用して、カレンダーテーブルからすべてのレコードを取得し、productsテーブルで一致するレコードのみを取得していることに注意してください。
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 >= (SELECT MIN(Created) FROM products) AND c.cDate <= (SELECT MAX(Created) FROM products); GO
作成|数量 :--------------- -: 2018年10月1日00:00:00 | 2 2018年11月1日00:00:00 | 2 2018年12月1日00:00:00 | 0 2018年1月13日00:00:00 | 0 2018年1月14日00:00:00 | 0 15/01/2018 00:00:00 | 1
dbfiddle ---(ここ