我有一个包含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
我怎么做到这一点,我无法理解它。
答案 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;