假設我有一張桌子Orders,每個訂單都有CreatedDate一DeliveredDate列。
如何為范圍內的每個日期選擇一個計數,該計數包括日期介于CreatedDate和之間的所有記錄DeliveredDate?假設獲得 2021-10-04 到 2021-10-09 范圍內的結果
如果Orders表看起來像這樣
ID CreatedOn DeliveredOn
1 2021-10-04 2021-10-04
2 2021-10-06 2021-10-07
3 2021-10-06 2021-10-08
4 2021-10-07 2021-10-08
5 2021-10-08 2021-10-09
結果應該是這樣的
Date ActiveCount
2021-10-04 1
2021-10-05 0
2021-10-06 2
2021-10-07 3
2021-10-08 3
2021-10-09 1
因此,訂單 1 僅適用于 2021-10-04 的計數,而訂單 3 適用于 2021-10-06、2021-10-07 和 2021-10-08 的計數,因為那是交付日期。
我對 SQL 不太擅長,而且我無法理解如何做到這一點。如果有人能指出我正確的方向,我將不勝感激!
uj5u.com熱心網友回復:
假設您將根據輸入引數值在您的程式中生成日期表,您只需要 aLEFT JOIN和 a COUNTwith GROUP BY:
DECLARE @Dates TABLE ([Date] DATE);
DECLARE @Orders TABLE (ID INT, CreatedOn DATE, DeliveredOn DATE);
INSERT @Dates ([Date])
VALUES ('2021-10-04'),('2021-10-05'),('2021-10-06'),
('2021-10-07'),('2021-10-08'),('2021-10-09');
INSERT @Orders (ID, CreatedOn, DeliveredOn)
VALUES (1, '2021-10-04', '2021-10-04'),
(2, '2021-10-06', '2021-10-07'),
(3, '2021-10-06', '2021-10-08'),
(4, '2021-10-07', '2021-10-08'),
(5, '2021-10-08', '2021-10-09');
SELECT d.[Date], COUNT(ID) AS ActiveCount
FROM @Dates d
LEFT JOIN @Orders o ON o.CreatedOn <= d.[Date] AND o.DeliveredOn >= d.[Date]
GROUP BY d.[Date];
表格的順序在這里很重要。您想查看范圍內的所有日期,因此您從該表開始。該LEFT JOIN會從該表中回傳所有的記錄,并在Orders表記錄中,其中JOIN條件匹配帶來的。您將獲得每場比賽的單獨記錄,因此請使用COUNTwithGROUP BY獲取每天的總計數。
uj5u.com熱心網友回復:
如果您有一個包含所有日期的表格,那么應該可以使用以下內容:
SELECT d.[date] as [Date], COUNT(*) as ActiveCount
FROM dates d
WHERE d.[date] >= @startDate AND d.[date] <= @endDate
LEFT JOIN orders o ON o.CreatedDate <= d.[date] and o.DeliveredDate >= d.[date]
GROUP BY d.[date]
ORDER BY [Date]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341130.html
標籤:sql sql-server
