現在、私はこのクエリを持っています:
select
sum(case when my_table.property_type = 'FLAT' then my_table.price else 0 end) as Flat_Current_Asking_Price,
sum(case when my_table.property_type_mapped = 'SEMIDETACHED' then my_table.price else 0 end) as Semidetached_Current_Asking_Price
from
my_table;
だからmy_table
には次の値があります。
property_type | price
--------------+-------
FLAT | 5000
SEMIDETACHED | 9000
FLAT | 6000
クエリは次を返します:
Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
11000 | 9000
sum
を置換して配列に値を累積して取得するにはどうすればよいですか。
Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
{5000, 6000} | {9000}
?
PostggreSQLのバージョンが9.4以降の場合は、 FILTER
句を使用します。
select
array_agg(my_table.price) filter(where my_table.property_type = 'FLAT' ) as Flat_Current_Asking_Price,
array_agg(my_table.price) filter(where my_table.property_type = 'SEMIDETACHED') as Semidetached_Current_Asking_Price
from
my_table;
配列が必要な場合は、SUM
の代わりにarray_agg
を使用します。
SELECT
array_agg(case when my_table.property_type = 'FLAT' then my_table.price end) as Flat_Current_Asking_Price,
array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end) as Semidetached_Current_Asking_Price
FROM
my_table;
flat_current_asking_price | semidetached_current_asking_price :--------------------- :-------------------------------- {5000、NULL、6000} | {NULL、9000、NULL}
Nullを削除したい場合は、代わりに小さめのトリックを使用します(array_to_stringはnullを削除します)。
SELECT
string_to_array(array_to_string(array_agg(case when my_table.property_type = 'FLAT' then my_table.price end), '|'), '|') as Flat_Current_Asking_Price,
string_to_array(array_to_string(array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end), '|'), '|') as Semidetached_Current_Asking_Price
FROM
my_table;
flat_current_asking_price | semidetached_current_asking_price :------------------------ | :-------------------------------- {5000,6000} | {9000}
dbfiddle ---(ここ
補遺
Abelistoのコメントによると、array_remove
を使用することもできます:
SELECT
array_remove(array_agg(case when my_table.property_type = 'FLAT' then my_table.price end), NULL) as Flat_Current_Asking_Price,
array_remove(array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end), NULL) as Semidetached_Current_Asking_Price
FROM
my_table;
dbfiddle ここ