Nếu tôi hiểu đúng, bạn muốn đếm mục nhập riêng biệt cho một trạng thái cụ thể trong khoảng thời gian của mình ... nếu đúng như vậy, bạn nên sử dụng DISTINCT
mệnh đề trong count()
của bạn thay đổi từ count (*) thành count (Entry_id riêng biệt)
with c (Status_Id, Entry_Id, Start_Date) AS (
select Status_Id, Entry_Id, Start_Date from tbl where
(End_Date BETWEEN '19000101' AND '21000101')
AND ((Start_Date BETWEEN '19000101' AND '21000101')
OR End_Date <= '21000101'))
select Status_Id, count(distinct Entry_Id) as cnt from
(select Entry_Id, max(start_date) as start_date from c
group by Entry_Id) d inner join
c on c.Entry_Id = d.Entry_Id
and c.start_date = d.start_date
GROUP BY Status_Id WITH ROLLUP
CHỈNH SỬA
Miễn là bạn không quan tâm trạng thái nào được trả về cho một mục nhập nhất định, tôi nghĩ bạn có thể sửa đổi truy vấn bên trong để trả về Trạng thái đầu tiên và kết hợp cả trạng thái đó
with c (Status_Id, Entry_Id, Start_Date) AS (
select Status_Id, Entry_Id, Start_Date from tbl where
(End_Date BETWEEN '19000101' AND '21000101')
AND ((Start_Date BETWEEN '19000101' AND '21000101')
OR End_Date <= '21000101'))
select c.Status_Id, count(c.Entry_Id) as cnt from
(select Entry_Id, Start_Date, (select top 1 Status_id from c where Entry_Id = CC.Entry_Id and Start_Date = CC.Start_Date) as Status_Id
from (select Entry_Id, max(start_date) as start_date from c
group by Entry_Id) as CC) d inner join
c on c.Entry_Id = d.Entry_Id
and c.start_date = d.start_date
and c.status_id = d.status_id
GROUP BY c.Status_Id
Kết quả
Status_id Count
489 2
492 1
495 1