でクロス集計関数を使用しpostgresql
てpivot table
. ただし、クエリ内で SQL を構造化する方法を理解するのに苦労しています。私のデータは 4 つの列で構成され、次のようになります。
次のコードを使用してこのテーブルを作成します。
CREATE TABLE ct(id SERIAL, zone_id int, group_id int, area double precision);
INSERT INTO ct(zone_id, group_id, area) VALUES(1,2,6798.50754160784);
INSERT INTO ct(zone_id, group_id, area) VALUES(1,3,10197.7613124118);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,1,85708.8676744647);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,2,56006.5971338327);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,3,5584.33145616642);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,5,8611.99732832252);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,6,36103.5509183704);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,8,9801.14541428806);
INSERT INTO ct(zone_id, group_id, area) VALUES(5,1,45796.0020793546);
postgresql
ドキュメントに厳密に従って、クエリで次のコードを使用しますcrosstab
。
SELECT *
FROM crosstab(
'select zone_id, group_id, area
from ct
')
AS ct(row_name integer,
g_1 double precision,
g_2 double precision,
g_3 double precision,
g_4 double precision,
g_5 double precision,
g_6 double precision,
g_7 double precision,
g_8 double precision);
これにより、次の表が得られますが、これは私が望んでいるものではありません。
たとえば、行 2 では、次の値が必要です。
85708.8676744647, 56006.5971338327, 5584.33145616642, NULL, 8611.99732832252, 36103.5509183704, NULL, 9801.14541428806
代わりに、値は次のとおりです。
85708.8676744647, 56006.5971338327, 5584.33145616642, 8611.99732832252, 36103.5509183704, 9801.14541428806
ただし、値が無視されているように見えるため、から までnull
の列名は元のグループに対応していません。g1
g8