2016-12-20 131 views
-3

我有一張表,其中包含2個時間戳,一個用於到達網站上的對象,另一個表示該對象離開網站時的時間戳。SQL - 每月/每年的計數

我想要一個查詢,它會顯示每月/每年有多少個對象,即使只有一天它應該加起來到那個月。

我的樣本數據是這樣的:

Object || ArrivalDate || LeaveDate 
Object 1 || 01-JAN-2016 || 28-JAN-2016 
Object 2 || 01-JAN-2016 || 31-MAR-2016 
Object 3 || 01-JAN-2016 || 25-FEB-2016 
Object 1 || 1-FEB-2016 || 28-MAR-2016 
Object 4 || 5-FEB-2016 || 1-APR-2016 

我想一個查詢,會顯示以下結果: JAN-2016 3 FEB-2016 4 MAR-2016 3 APR-2016 1

我該如何做到這一點,我無法擺脫困境。

+2

指定樣本數據和期望的結果 – Mansoor

+0

另外,「有多少個對象,其中每月網站/一年「含糊不清。你想知道在那個月的任何時間點,在開始時,結束時,在中間的任意一天,有多少人在現場? – iamdave

+0

問題更改爲更具說明性 –

回答

1

在基本層面:

select 'Jan' as Period, count(Items) as Items 
from MyTable 
where (LeaveDate > '2016-01-01' or LeaveDate is null) 
and EnterDate < '2016-02-01' 

我會建議使用日曆表雖然,但是這是一個基本的概念。

0
  • A是到達的一年OBJETS的計數,

  • B是這一年留下OBJETS的計數,

  • C是到達和離開對象的個數今年

  • d是一年到來之前的對象,之後

012離開

這是在您的網站的對象的數量是d + A + BC

在TSQL:

SELECT ((SELECT count(*) 
    FROM mytable 
    WHERE (leaveDate >= '01-01-2016' 
      AND leaveDate <= '12-31-2016')) + 
    (SELECT count(*) 
    FROM mytable 
    WHERE enterDate <= 01-01-2016 
      AND leaveDate >= 12-31-2016) + 
    (SELECT count(*) 
    FROM mytable 
    WHERE enterDate >= 01-01-2016 
      AND enterDate <= 12-31-2016) - 
    (SELECT count(*) 
    FROM mytable 
    WHERE enterDate >= 01-01-2016 
      AND enterDate <= 12-31-2016 
      AND leaveDate >= 01-01-2016 
      AND leaveDate <= 12-31-2016)) AS total; 

如果我沒有做一個錯誤,這會給您的網站上的所有對象在2016年

0

你可以用累計和做到這一點。這個想法是統計數的進入和每個月離開,然後做一個累加求和值:

select yyyy, mm, sum(cnt), 
     sum(sum(cnt)) over (order by yyyy, mm) 
from ((select year(enterdate) as yyyy, month(enterdate) as mm, count(*) as cnt 
     from t 
     group by year(enterdate) as yyyy, month(enterdate) 
    ) union all 
     (select year(leavedate) as yyyy, month(leavedate) as mm, - count(*) as cnt 
     from t 
     group by year(leavedate) as yyyy, month(leavedate) 
    ) 
    ) t 
group by yyyy, mm 
order by yyyy, mm;