2016-12-20 3 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 февралем-2016 4 MAR-2016 3 апреля-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
  • А отсчет OBJETS, поступивших за год,

  • B является счетчиком OBJETS, который оставил этот год,

  • C является подсчет объектов, прибывших и выбывших год

  • D является объектом, который прибыл до года, и оставил после

Количество объектов, которые были на вашем сайте, 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; 
Смежные вопросы