我以前能用了一個例子,最終沒有發佈,但回來後,決定無論如何將它張貼:)
-- Sample Data
CREATE TABLE #SampleVals (ID int, Open_Date Date, Close_Date Date);
INSERT INTO #SampleVals(ID, Open_Date, Close_Date)
VALUES(1,'20100101','20100301'),
(2,'20110121','20110212'),
(3,'20100301', NULL),
(4,'20100110',NULL);
-- Get Start/End for full date range
DECLARE @Min Date, @Max Date;
SELECT @Min = DateAdd(dd,-1 * Day(MIN(Open_Date)) + 1, MIN(Open_Date)),
@Max = MAX(Close_Date)
FROM #SampleVals;
-- Query for values across entire range
WITH DateRange (StartDate,NextDate) AS (
SELECT DATEADD(MONTH, n-1, @Min),
DATEADD(MONTH, n, @Min)
FROM dbo.Number N
WHERE N.n <= DATEDIFF(MONTH,@Min,@Max) + 1
)
SELECT MONTH(DR.StartDate),
YEAR(DR.StartDate),
SUM(CASE WHEN S.Open_Date >= DR.StartDate Then 1 Else 0 END) AS [Open],
SUM(CASE WHEN S.Close_Date < DR.NextDate Then 1 Else 0 END) AS [Closed]
FROM DateRange DR
LEFT JOIN #SampleVals S ON S.Open_Date < DR.NextDate
AND (S.Close_Date >= DR.StartDate OR S.Close_Date IS NULL)
GROUP BY DR.StartDate
ORDER BY DR.StartDate;
-- Cleanup sample data
DROP TABLE #SampleVals;
的樣本數據的日期已更改,以反映年月日。我還用的本地號碼錶:
CREATE TABLE dbo.Number(n INT NOT NULL IDENTITY) ;
GO
SET NOCOUNT ON ;
INSERT dbo.Number DEFAULT VALUES ;
WHILE SCOPE_IDENTITY() < 5000
INSERT dbo.Number DEFAULT VALUES ;
我幾乎沒有張貼此,作爲Norla得到它做得比較早之前,我完成了這一個,但我注意到Norla的解決方案填充關閉列,如果開始日期被關閉(以及開始日期的月份),而此版本在close_date的月份中填充close月份列,我相信這是您要求的。
爲什麼你要計算一個Id 2010年1月爲關閉? – Lamak
對不起,我的錯。更正它。 – sunprophit
我相信2010年3月線應該是1,1而不是0,1來反映第3條記錄? – Tarwn