SQL - 每月/每年的计数

时间:2016-12-20 10:56:18

标签: sql sql-server tsql

我有一个包含2个时间戳的表,一个用于现场到达对象,第二个是对象离开站点时。

我想要一个查询,它会告诉我每月每年有多少对象,即使只有一天它应该累计到那个月。

我的示例数据如下所示:

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  

我想要一个显示以下结果的查询: 2016年1月3日 FEB-2016 4 2016年3月3日 APR-2016 1

我怎么做到这一点,我无法理解它。

3 个答案:

答案 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'

我建议使用日历表,但这是一个基本概念。

答案 1 :(得分:0)

  • A是年内到达的对象数量,

  • B是今年留下的objets的数量,

  • C是到达并离开年份的对象数

  • D是在年之前到达的对象,在

  • 之后离开

您网站上的对象数量为D + A + B-C

在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年为您提供网站上的所有对象

答案 2 :(得分: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;