2016-09-27 12 views
1

私は3つのクエリを持っています。私はそれらをすべて1つのクエリにまとめようとしています。ここで彼らは、その出力である:非常によく似た3つのクエリを組み合わせる? (Postgres)

クエリ1:

SELECT distinct on (name) name, count(distinct board_id) 
FROM tablea 
INNER JOIN table_b on tablea.id = table_b.id 
GROUP BY name 
ORDER BY name ASC 

出力:

A | 15 
B | 26 
C | 24 
D | 11 
E | 31 
F | 32 
G | 16 

クエリ2:

SELECT distinct on (name) name, count(board_id) as total 
FROM tablea 
INNER JOIN table_b on tablea.id = table_b.id 
GROUP BY 1, board_id 
ORDER BY name, total DESC 

出力:

A | 435 
B | 246 
C | 611 
D | 121 
E | 436 
F | 723 
G | 293 

最後に、最後のクエリ:

SELECT distinct on (name) name, count(board_id) as total 
FROM tablea 
INNER JOIN table_b on tablea.id = table_b.id 
GROUP BY 1 
ORDER BY name, total DESC 

出力:

A | 15 | 435 | 14667 
B | 26 | 246 | 65123 
C | 24 | 611 | 87426 
D | 11 | 121 | 55198 
E | 31 | 436 | 80612 
F | 32 | 723 | 31485 
G | 16 | 293 | 43392 

EDIT:

A | 14667 
B | 65123 
C | 87426 
D | 55198 
E | 80612 
F | 31485 
G | 43392 

、それはこのようになり、それをフォーマットすることは可能ですして

@ Clodoaldo Netoの助けを借りて、私はこれと第一と第三の質問を組み合わせた:

SELECT name, count(distinct board_id), count(board_id) as total 
FROM tablea 
INNER JOIN table_b on tablea.id = table_b.id 
GROUP BY 1 
ORDER BY description ASC 

この新しいものと2番目のクエリを組み合わせることから私を防ぐ唯一のことは、それであることをboard_idを必要とGROUP BY句です。ここからの思いは?

+0

2番目のクエリの 'GROUP BY'句の' board_id'列ことは何ですか? –

+0

@LaurenzAlbe私は2つのクエリをわずかに編集しました。私は '*'ワイルドカードを 'board_id'に置き換えて、同じ出力を得ました。これはどんなことに役立ちますか? – John

+1

'distinct on'は最初のクエリと3番目のクエリには効果がないことに注意してください –

答えて

1

これは、テストデータなしでは直面するのが難しいです。しかし、ここで私の試みです:

with s as (
    select name, grouping(name, board_id) as grp, 
     count(distinct board_id) as dist_total, 
     count(*) as name_total, 
     count(*) as name_board_total 
    from 
     tablea 
     inner join 
     table_b on tablea.id = table_b.id 
    group by grouping sets ((name), (name, board_id)) 
) 
select name, dist_total, name_total, name_board_total 
from 
    (
     select name, dist_total, name_total 
     from s 
     where grp = 1 
    ) r 
    inner join 
    (
     select name, max(name_board_total) as name_board_total 
     from s 
     where grp = 0 
     group by name 
    ) q using (name) 
order by name 

https://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-GROUPING-SETS

関連する問題