Sql-Server
如何顯示按日期分組的日期範圍內的所有日期?
假設我有一個名為“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
如果我執行此查詢:
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
我該怎麼做?
日曆表的基本實現。
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 從日曆表中獲取所有記錄,並且只獲取與產品表匹配的記錄。
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
創建 | 數量 :------------------ | --: 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在這裡