2012-08-10 3 views
1

이름이 "Sometable"인 테이블에서 business_line (값 X, Y) 및 business_segment (값 X, Y, Z는 X와 Y가 business_line과 같습니다)가 있습니다. 나는 type_of_payment (값 A, B, C, D, E)라는 이름의 또 다른 컬럼과 transaction_value라는 이름을 가진 최종 컬럼을 가지고있다. 이것은 내가하고 싶은 것입니다 :그룹 내에서 그룹을 수행

business_line 및 business_segment별로 그룹화 된 거래를 합산하고 A, C, E에서 지불 한 비율도 알아보십시오. 따라서 출력 테이블은 다음과 같습니다.

           (last three columns can be named anything 
               but they specify proportions of A,C,E) 
Business_line  SUM(transaction_value) A  C  E 
and business seg. 
X     100      20%  30%  50% 
Y     200      11%  12%  77%  
X     300      and so on 
Y     170 
Z     230 

어떻게해야합니까 ??

PS : ACE의 합계는 B 100 %가 될 필요는없고 D는이 표준 SQL 오라클 (그러나 안된)에서 작동해야한다

+0

분석 기능을 살펴 보았습니까? – jle

+0

그룹별로 이것을 사용하고 싶습니다. 그룹 내에서 그룹을 생각하고 있었지만 정확하게하는 법을 모릅니다. 분석 기능에 대해서는 전혀 모른다. – user1356163

+1

'B'및 'D'지불 및/또는 'B'및 'D'지급이 포함 된 경우에도 'A', 'C'및 'E'비율은 항상 100 % 합계로? –

답변

2

존재 오라클 11g를 들어

SELECT 
    business_line, 
    business_segment, 
    grand_total, 
    A_total * 100.0/grand_total as A, 
    C_total * 100.0/grand_total as C, 
    E_total * 100.0/grand_total as E 
FROM 
    (
     SELECT 
      business_line, 
      business_segment, 
      SUM(transaction_value) as grand_total, 
      SUM(CASE WHEN payment_type = 'A' THEN transaction_value END) as A_total, 
      SUM(CASE WHEN payment_type = 'C' THEN transaction_value END) as C_total, 
      SUM(CASE WHEN payment_type = 'E' THEN transaction_value END) as E_total 
     FROM 
      SomeTable 
     GROUP BY 
      business_line, 
      business_segment 
    ) as t 
+0

SUM (CASE는 payment_type = 'A'THEN transaction_value)를 A_total으로 사용합니다. 저는 case 문을 이해하지만 "그 후"transaction_value는 무엇을합니까? – user1356163

+0

@ganducoder -'CASE' 문장의'END' 부분이 빠졌습니다 (지금 편집 됨). 기본적으로, 그것들 각각은 그'SUM()'이 우리가 관심있는 것과 일치하는'payment_type' 값만을 포함한다는 것을 보장합니다 - 그래서 그것은 조건부 합계 SUM입니다. 그런 다음 외부 선택에서 합계를 사용하여 백분율을 계산할 수 있습니다. –

+0

k 얻었습니다 .. 테스트하지 않았습니다 .. 언젠가는 가능할 수 있습니다 .. 논리적으로 올바른 것처럼 받아 들일 수 있습니다. – user1356163

2

이상을 사용할 수 있습니다. PIVOT

select * 
from 
(
select sometable.line, paymenttype,total, 100.0*transaction_value/total as percentage 
from sometable 
    inner join 
    (select line, sum(transaction_value) as total 
     from sometable 
     group by line) total 
    on sometable.line = total.line   
) 
pivot 
(
    sum(percentage) for paymenttype in (a,c,e) 
) 
관련 문제