2014-05-17 1 views
-1

I가 다음 쿼리 :는 SQL 피벗

select distinct 
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID) as Total, 
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID and DateDue <= DATEADD(day,-1, GETDATE()))as TotalOverdue, 
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID and DateDue >= DATEADD(day,-1, GETDATE())) as Totaldue 
from Task 

그것은 나에게 다음과 같은 결과 제공 :

Total: 5 
TotalOverdue: 4 
TotalDue: 1 
그러나

Total | TotalOverdue | TotalDue 
5  | 4   | 1 

, 나는 그것을 이런 식으로 형식의 원하는을

피벗 기능을 사용해 보았지만 제대로 작동하지 않습니다. 어떤 아이디어?

+0

당신은 ['UNION ALL'] (http://www.techonthenet.com/oracle/union_all.php) 연산자를 찾고 있습니다 ... – Ben

+0

나는 모든 연산자를 사용하여 조합을 시도했지만, 단일 열의 데이터로 끝났지 만 어떤 행이 무엇에 속하는 지 알 수있는 방법이 없습니다. – dQlle

답변

0

는 당신이 조건부 집계와 함께 원하는 것을 할 수 있다고 생각 :

모든 감독자를 위해 그것을 원하는 경우
select count(*) as Total, 
     sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0 
      end) as TotalOverdue, 
     sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0 
      end) as TotalDue 
from Task join 
    Employee 
    on task.UserID = Employee.UserID 
where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206'; 

,

select SupervisorID, count(*) as Total, 
     sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0 
      end) as TotalOverdue, 
     sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0 
      end) as TotalDue 
from Task join 
    Employee 
    on task.UserID = Employee.UserID; 

편집 :

당신은 정말를 피벗 해제하려면 데이터. 한 가지 방법은 다음과 같습니다.

하나의 열을 문자열로 사용하려면 concat()을 사용하십시오.

+0

함수가 완벽하게 작동하지만 데이터를 피벗하지 않습니다. 이전과 동일한 출력을 제공합니다. – dQlle