2017-03-04 73 views
0

我希望仅在该服务日期与客户的第一次服务匹配时才跳过每个客户的首次服务日期。仅跳过第一次服务日期

例如,如果客户报名参加2017年1月4日

client enrollment date  service date
sam 1-04-2017 1-04-2017 sam 1-04-2017 1-04-2017 jon 1-04-2017 1-04-2017
jon 1-04-2017 1-05-2017 sam 1-04-2017 1-05-2017
jon 1-04-2017 1-07-2017
用于汇总页面预期的结果

total clients  total services 
    2      4  

预期结果的结果,当我想查看详细信息

client enrollment date  service date
sam 1-04-2017 1-04-2017 jon 1-04-2017 1-05-2017 sam 1-04-2017 1-05-2017
jon 1-04-2017 1-07-2017

你的客户也有一个注册,但多个服务。 考虑到查询将被上传到ssrs并且服务日期将变为@begindate和@enddate之间的变量s.begindate,我如何跳过查询中的第一个服务日期。

+1

这两个客户端很明显。这三项服务是什么?在这种情况下,“抵消”是什么意思? –

回答

0

根据你所提供的,这是我猜你需要的。

CREATE TABLE T (id int identity, client varchar(10), enrollment_date date, service_date date) 

--client enrollment date  service date 
INSERT INTO T VALUES 
('sam','1-04-2017','1-04-2017'), 
('sam','1-04-2017','1-04-2017'), 
('jon','1-04-2017','1-04-2017'), 
('jon','1-04-2017','1-05-2017'), 
('sam','1-04-2017','1-05-2017'), 
('jon','1-04-2017','1-07-2017') 

DECLARE @StartDate date = '1-04-2017', @EndDate date = '1-07-2017' 

SELECT COUNT(DISTINCT client) AS total_clients, COUNT(1)-COUNT(DISTINCT client) AS total_services 
FROM T 
WHERE service_date BETWEEN @StartDate AND @EndDate 

SELECT DISTINCT T.* 
FROM T T JOIN (SELECT client, MIN(id) AS enroll_id FROM T GROUP BY client) E 
ON T.client = E.client 
AND T.id <> E.enroll_id 
WHERE service_date BETWEEN @StartDate AND @EndDate 
ORDER BY 2, 3 

DROP TABLE T 

这些是我从中得到的新结果。

total_clients total_services 
------------- -------------- 
2    4 

id   client  enrollment_date service_date 
----------- ---------- --------------- ------------ 
4   jon  2017-01-04  2017-01-05 
6   jon  2017-01-04  2017-01-07 
2   sam  2017-01-04  2017-01-04 
5   sam  2017-01-04  2017-01-05 

这只是从整体计数中减去客户端的不同计数以抵消登记事件。

希望这可以帮助你。

+0

这是一个非常合理的解释。 OP很高兴澄清这是他真正想要的。 –

+0

是的,一些额外的细节会很好。我开始编写类似于您发布的内容的代码,但事实是许多服务日期与登记日期相匹配。我喜欢这个解决方案的想法,这很容易,但总是会出现... :) –

+0

大家好抱歉没有提供尽可能多的细节。我已经更新了这个问题以包含更多细节。 –

0

从你的描述,你似乎使用窗函数想要一个简单的where条款:

select t.* 
from (select t.*, 
      min(enrollment_date) over (partition by client) as first_enrollment_date 
     from t 
    ) t 
where first_enrollment_date > service_date; 

然而,这将只留下两个服务,所以目前还不清楚你真正想要的。