2016-07-27 37 views
2

我正在使用SQL Server 2008 R2,我想顯示可以申請,批准,拒絕或取消的申請狀態。在SQL Server中允許審批狀態

如果全部離開批准則狀態=批准,像其他葉子

但如果有混合狀態e.g一些離開批准,那麼一些拒收狀態=部分。

我寫了代碼,但我覺得它很複雜,我可以在一個單一的查詢中得到它嗎?

create table #t 
(
    employeeID int, 
    LeaveCode nvarchar(10), 
    status nvarchar(50) 
) 

insert into #t 
values(1, 'PL', 'Approve'), (1, 'PL', 'Reject'), (1, 'PL', 'Approve') 

;with ct1 as 
(
    select status, count(status) Cnt 
    from #t 
    group by status 
), 
counters as 
(
    select count(*) as TotalLeave 
    from #t 
) 
select top(1) 
    CASE 
     WHEN C1.Cnt = C2.TotalLeave 
      THEN C1.status 
     ELSE 'Partial' 
    END [status] 
from 
    ct1 C1 
cross join 
    counters C2 

drop table #t 

回答

2

嘗試此,

create table #t 
(
employeeID int, 
LeaveCode nvarchar(10), 
status nvarchar(50) 
) 
insert into #t values(1,'PL','Approve'),(1,'PL','Reject'),(1,'PL','Approve') 
insert into #t values(2,'PL','Approve'),(2,'PL','Approve'),(2,'PL','Approve') 

SELECT 
    employeeID, 
    CASE WHEN count(DISTINCT status) = 1 THEN MAX(status) ELSE 'Partail' END [status] 
FROM #t 
GROUP BY employeeID 

drop table #t 
1
SELECT 
    CASE 
     WHEN COUNT(DISTINCT t.status) > 1 THEN 'Partial' 
     ELSE MAX(t.status) 
    END OveralLeaveStatus 
FROM #t t 
1

簡單地通過僱員組,並檢查其最大值(狀態)<>分鐘(狀態),如果是差比是指至少一個狀態不同

select employeeID, 
     [status] = case when min([status]) <> max([status]) then 'Partial' 
       else min([status]) 
       end 
from #t 
group by employeeID