2017-04-13 1 views
0

이 쿼리가 있습니다. 작업 테이블에서 AWARDED (1) 및 NOT AWARDED (0) 작업에 대해 Count를 반환해야합니다.2 열의 개수를 반환하는 방법은 무엇입니까?

 Select Count(w.WorkID)as Total, w.IsAwarded, org.OrganizationName 
     From Works w 
     Inner Join MC_MemberShip.Membership.Organization org 
     ON org.OrganizationID= w.Organization_ID 
     where Convert(varchar(11), w.OpeningDate) >= Convert(varchar(11), @FromDate) 
     and Convert(varchar(11), w.OpeningDate) < DATEADD(day, 1, Convert(varchar(11), @ToDate)) 
     and w.IsActive=1 and 
     ISNULL(w.IsAwarded,0)= 0 and w.Organization_ID= case when @OrgID= -1 then w.Organization_ID else @OrgID end 
     group by org.OrganizationName, w.IsAwarded 

지금이 쿼리 즉 0 만 수여하지만 난 같은 쿼리 너무 수여를 위해 수를 반환 할 NOT에 대한 총 수를 반환합니다.

Organization TotalAwardedWorks TotalNotAwardedWorks 
Town 1    1      2 
Town 2    44      33 
+1

왼쪽 정렬 된 SQL은 읽기가 너무 어렵습니다. – jarlh

+0

일부 샘플 테이블 데이터와 예상 결과 및 서식있는 텍스트를 추가하십시오. – jarlh

+0

샘플 데이터와 원하는 결과를 제공하십시오. –

답변

2

귀하의 질문은 다음과 비슷한 모습이 될 것

select org.OrganizationName, 
     Count(*) as Total, 
     sum(case when w.IsAwarded = 0 or w.IsAwarded is null then 1 else 0 end) as TotalNotAward, 
     sum(case when w.IsAwarded = 1 then 0 else 1 end) as TotalAward 
from Works w Inner Join 
    MC_MemberShip.Membership.Organization org 
    on org.OrganizationID = w.Organization_ID 
where w.OpeningDate >= @FromDate and 
     w.OpeningDate < dateadd(day, 1, @ToDate) and 
     w.IsActive = 1 and 
     (w.Organization_ID = @OrgId or @OrgID= -1) 
group by org.OrganizationName; 

참고 :

  • 는 비교를 수행하기 위해 문자열로 날짜를 변환하지 마십시오. 그것은 단지 비뚤어진 것입니다.
  • 일반적으로 절에있는 case의 사용은 권장하지 않습니다. 논리는 or을 사용하여보다 명확하게 표현됩니다.
  • 집계 함수에 조건을 넣으려면 case을 사용하여 원하는 것을 얻을 수 있습니다.
+0

감사하지만 SUM 부분은 다음과 같아야합니다. – Covert

+1

합계 (대소 문자가 w.IsAwarded = 1, 다음으로 1 else 0 end) TotalAwarded, 합계 (w.IsAwarded = 0 또는 w.IsAwarded가 null 일 때 0 이외의 경우) 1 end) as TotalNotAwarded – Covert

관련 문제