2017-09-14 6 views
0

以下のようなテーブルt1では、各makeのために必要な出力は以下の通りである各typeSQL - 複数のグループによるagrregate数及びシェア

+--------+------+ 
| make | type | 
+--------+------+ 
| toyota | car | 
| audi | suv | 
| bmw | suv | 
| bmw | suv | 
| audi | car | 
+--------+------+ 

のカウントと%のシェアを取得する必要があります。

+--------+------+---------------+---------------+ 
| make | type | vehicle_cnt | vehicle_pct | 
+--------+------+---------------+---------------+ 
| toyota | car |    1 |   100.0 | 
| audi | suv |    1 |   50.0 | 
| audi | car |    1 |   50.0 | 
| bmw | suv |    2 |   100.0 | 
+--------+------+---------------+---------------+ 

私は、以下のクエリを使用して(vehicle_cntなど)makeが各タイプのカウントを取得することができますよ。しかし、パーセンテージシェアを得る方法についてのインプットが必要です。

select 
make 
, type 
, count (*) as vehicle_cnt 
from t1 
group by make, type 

答えて

1

はここのように、異なる集計ウィンドウを試してみてください。

select DISTINCT 
make 
, type 
, count (*) over (partition by make, type) as vehicle_cnt 
, count (1) over (partition by make, type)*100/count (1) over (partition by make) as vehicle_pct 
from t1 
0

のCTEのカップルを使用します。

with CTE as 
(
select 
make 
, type 
, count (*) as vehicle_cnt 
from t1 
group by make, type 
), 
M2 as 
(
select type, sum(vehicle_cnt) as tot 
from CTE 
group by type 
) 
select CTE.*, 100*(CTE.vehicle_cnt/M2.tot) as pc 
from CTE 
inner join M2 
on m2.type = CTE.type 
0
select make, 
     type, 
     count(*) as vehicle_cnt, 
     round((count(*) * 100/(select count(*) from t1)::numeric), 1) as vehicle_pct 
    from t1 
group by make, type 
関連する問題