它應該是這樣的:
測試表初始化
DROP TABLE BreakdownLog
CREATE TABLE BreakdownLog
(
EquipmentID INT,
ProblemID INT,
BreakdownDate DATETIME,
IssueFixedDate DATETIME NULL
);
INSERT INTO BreakDownLog VALUES (1, 1, '01-Jun-2011', '01-Sep-2011')
INSERT INTO BreakDownLog VALUES (1, 2, '01-Jun-2011', '01-Oct-2011')
INSERT INTO BreakDownLog VALUES (2, 1, '01-Jun-2011', '01-Oct-2011')
INSERT INTO BreakDownLog VALUES (2, 2, '01-Jun-2011', '01-Oct-2011')
INSERT INTO BreakDownLog VALUES (3, 1, '15-Jun-2011', '01-Sep-2011')
INSERT INTO BreakDownLog VALUES (3, 2, '10-Jun-2011', '25-Aug-2011')
INSERT INTO BreakDownLog VALUES (4, 1, '01-Jun-2011', '01-Aug-2011')
INSERT INTO BreakDownLog VALUES (4, 2, '10-Sep-2011', '22-Oct-2011')
INSERT INTO BreakDownLog VALUES (5, 1, '01-Jun-2011', '15-Jun-2011')
INSERT INTO BreakDownLog VALUES (5, 2, '02-Jun-2011', NULL)
真正的代碼
-- We exchange the NULLs in IssueFixedDate with the current date
; WITH Base AS (
SELECT EquipmentID, ProblemID, BreakdownDate
, ISNULL(IssueFixedDate
, CONVERT(VARCHAR(10), GETDATE(), 101)) IssueFixedDate
-- The previous line generates the current date without time
FROM BreakDownLog
)
-- We generate a table with all the days the equipment was broken.
-- This is done through a recursive CTE
, BaseDays AS (
SELECT EquipmentID, BreakdownDate AS DefunctDay, IssueFixedDate FROM Base
UNION ALL
SELECT EquipmentID, DefunctDay + 1 AS DefunctDay, IssueFixedDate
FROM BaseDays
WHERE DefunctDay + 1 <= IssueFixedDate
-- In T-SQL if you add 1 to a DateTime it's equivalent to adding a day
)
-- We make a distinct on the days where the equipment was broken,
-- to delete days where the equipment was broken for two reasons
, BaseDaysDistinct AS (
SELECT DISTINCT EquipmentID, DefunctDay
FROM BaseDays
)
-- We group the equipment's DefunctDays by EquipmentID
SELECT EquipmentID, COUNT(*) DefunctDays
FROM BaseDaysDistinct
GROUP BY EquipmentID
我們可以在已經改變了過去兩個選擇:
SELECT EquipmentID, COUNT(DISTINCT DefunctDay) DefunctDays
FROM BaseDays
GROUP BY EquipmentID
簡化我生成使用遞歸CTE BreakdownDate和IssueFixedDate之間的天列表,刪除多次出現並數着日子更天。
+1 ....但aaaaah ...花了15分鐘才能理解它,我不確定我能否以相同的方式重寫它。 – xanatos
我不會使用spt_values表,因爲它沒有證件性質。但是,與xanatos給出的CTE相比,確實是一個非常簡單的查詢。 – Raghu
我會給你另外一個鏈接的+1,因爲它非常有趣:-) – xanatos