Sql-Server

如何顯示按日期分組的日期範圍內的所有日期?

  • February 2, 2018

假設我有一個名為“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在這裡

引用自:https://dba.stackexchange.com/questions/196905