나는 샘플 데이터의 날짜는 YYYYMMDD를 반영하도록 변경되어 이전의 예를 흥분하고 게시하지 결국,하지만 다시 와서 어쨌든 그것을 게시 :)
-- 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;
결정 . 또한 로컬 번호 테이블 사용 : Norla 내가이 일을 완성하기 전에 이전에 이루어 졌던 것에
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의 솔루션을 닫기 열을 채 웁니다 발견 (그리고 해당 시작 날짜의 달 동안)이 버전은 close_date의 달에 가까운 월 열을 채우는 반면, 나는 당신이 요구 한 것이라고 믿습니다.
SQL 서버 2005 +의 경우
을 시도 할 수 있습니다? – Lamak
죄송합니다, 실수. 그것을 정정했다. – sunprophit
2010 년 3 월 라인은 1, 1이 아닌 0, 1이 레코드 # 3을 반영해야한다고 생각하십니까? – Tarwn