2017-03-16 1 views
0

내 데이터를 seconditemid으로 그룹화합니다. 전체 행 (모든 테이블 데이터의 초산 결합)에 대한 각 행의 백분율을 sum(extcost)으로 계산할 수 있습니까?PostgreSQL은 총 행의 합계에 대한 현재 행의 값의 백분율을 계산합니다.

예를 들어 결과 집합에 2 행이 있고 A1은 총 4500, A2는 총 5500, 총합은 10000, A1은 45 %, A2는 55 %를 차지합니다.

seconditemid|ratio 
-------------------- 
A1   |.45 
-------------------- 
A2   |.55 

내 쿼리가 작동하지 않습니다

select seconditemid, 
    round(100.0*(
     sum(case when seconditemid = ---the current row's seconditemid 
     then 1 else 0 end)/sum(extcost) 
    ),1) as ratio 
from inventory_fact f inner join item_master_dim i using (itemmasterkey) 
where transtypekey = 1 
group by seconditemid 
order by 2 desc; 

입니다.

CREATE TABLE c (
    seconditemid text, 
    total int 
); 

INSERT INTO c (seconditemid, total) VALUES ('A1', 4500); 
INSERT INTO c (seconditemid, total) VALUES ('A2', 5500); 

: 그것은

select seconditemid, round(100.0*(
     sum(extcost)/sum(v1.sumextcost) 
    ),1) as ratio 
from from inventory_fact f inner join item_master_dim i using (itemmasterkey), v1 
where transtypekey = 1 
group by seconditemid 
order by 2 desc; 

각 컬럼의 배급은 0

+0

, 당신에게 각 항목 값> = 10 %가 확실하다 ? 포인트 이후에만 첫 번째 자릿수로 올림합니다. – cur4so

답변

0

이의이 샘플 스키마를 보자됩니다에서 나는

create view v1 as(
    select sum(extcost) as sumExtcost from inventory_fact 
); 

먼저 뷰를 생성 및 선택 시도 검색어는 다음과 같습니다.

,428,721,

->

seconditemid | total | ratio 
--------------+-------+------- 
A1   | 4500 | 0.45 
A2   | 5500 | 0.55 
(2 rows) 
0

두 번째 쿼리는 확인을해야하지만 당신은 0 다시 integer division truncates the results 때문에이야 얻었다. 합계 값을 명시 적으로 float으로 변환해야합니다. 여기

는보기없이 예입니다

SELECT g.seconditemid, g.extcost::float/t.total::float percent -- << here 
    FROM (
    SELECT seconditemid, SUM(extcost) extcost 
    FROM inventory_fact 
    GROUP BY seconditemid 
) g CROSS JOIN (
    SELECT SUM(extcost) total 
    FROM inventory_fact 
) t 
ORDER BY percent DESC 

출력 : 2D 쿼리가 잘 보인다

 
| seconditemid | percent | 
|--------------|---------| 
|   A2 | 0.55 | 
|   A1 | 0.45 | 

SQLFiddle

관련 문제