2016-07-27 7 views
2

SQL Server 2008 R2を使用していますが、適用、承認、拒否、またはキャンセルのいずれかの状態を残してアプリケーションステータスを表示したいとします。SQL Serverの承認ステータスを残す

すべての場合には、他の葉

のように、承認=、ステータスを承認残すが、いくつかは、いくつかは、ステータス=部分的な拒否、承認したままの状態例えばミックスが存在する場合。

私はコードを書いたが、複雑であると感じていますが、1つのクエリで取得できますか?

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 
関連する問題