2012-01-12 2 views
1

SQL 라이브러리 (프로그래밍 라이브러리, ANSI SQL 호환, ABS 데이터베이스라고 함)로 작업하고 있습니다 (http://www.componentace.com/help/absdb_manual/absdbmanual_content.htm).). 그것은 약속의 테이블 인) 동일한 테이블의 여러 합계 열에 대한 SQL 외부 조인

내가 하나의 테이블 (APPT이 ... 등, CASE, 다양한 조인을 지원합니다. 일부 SA_ID/레이어 조합이 될 수 있음을

ApptKey - Integer - Primary Key 
SA_ID - Integer (a person’s ID, think employee number), 
Layer - Integer – only 4 different values, 1, 2, 3 or 4 (think Appt Category) 
Number_Of_Minutes - Integer – the length of the appointment 

주 비어 있음 (즉, 해당 조합에 대한 행이 없음) 다른 SA_ID/레이어 조합은 여러 행을 가질 수 있습니다 (여기서는 관련이 없으므로 다른 열을 표시하지 않습니다.) mi 각각의 사람 (SA_ID)에 대해, 각 행에 대해 ..., 즉 각각의 SA_ID는 자신의 행을 가지며, 계층 = 1, 계층 2의 합계, 계층 3의 합계 및 합계 층 = 4

예 데이터 ...

SA_ID   LAYER  Number_of_Minutes 
1    1   10 
1    1   30 
2    1   10 
3    2   10 
1    4   10 

I는이 결과를 제공하는 질의를해야한다. 이 쿼리는 차트/그래프 구성 요소를 공급하기 때문에

SA_ID  LAYER_1  LAYER_2 LAYER_3  LAYER_4 
1   40   0   0   10 
2   10   0   0   0 
3   0   10   0   0 

나는

은 내가 다중 상관 하위 쿼리에 가입 권리를 사용할 필요가 있다고 생각 ..., 형식이 형식이 필요하지만, 난 그냥 그것을 얻을 수 없습니다 일하다. 이것은 올바른 접근 방법입니다. 내가 아래에서 무엇을 실행하지만, 곧바로 조인으로. 내가 바깥 쪽 조인을 사용하기 위해 이것을 다시 작성할 수 있습니까? 바깥 세상이 최선의 방법인가?

select g.sa_id, l1.totalsum, l2.totalsum, l3.totalsum, l4.totalsum 
from (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 1 group by sa_id, layer) l1, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 2 group by sa_id, layer) l2, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 3 group by sa_id, layer) l3, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 4 group by sa_id, layer) l4, 
      (select distinct sa_id "sa_id" from appt) g 
where 
     (l1.sa_id = g.sa_id) 
and (l2.sa_id = g.sa_id) 
and (l3.sa_id = g.sa_id) 
and (l4.sa_id = g.sa_id) 

답변

1
SELECT SA_ID, 
SUM(CASE WHEN LAYER = 1 THEN Number_of_Minutes ELSE 0 END) AS LAYER_1, 
SUM(CASE WHEN LAYER = 2 THEN Number_of_Minutes ELSE 0 END) AS LAYER_2, 
SUM(CASE WHEN LAYER = 3 THEN Number_of_Minutes ELSE 0 END) AS LAYER_3, 
SUM(CASE WHEN LAYER = 4 THEN Number_of_Minutes ELSE 0 END) AS LAYER_4 
FROM Appt 
GROUP BY SA_ID 

편집 :이 CASE 표현식을 지원하기 때문에.

+0

간단하고 우아하며 작동합니다! 조인을하는 것보다 훨씬 간단합니다. 감사! – user1009073

0
SELECT 
    t.sa_id, 
    Layer1=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 1), 
    Layer2=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 2), 
    Layer3=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 3), 
    Layer4=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 4) 

FROM 
(
    SELECT DISTINCT 
     sa_id 
    FROM appt 
) t 
관련 문제