web-dev-qa-db-ja.com

複数の列に対するPostgresクロス集計クエリ

複数の列でクロス集計クエリを作成しようとしています。

それを達成するために、私は最初にタイプを作成しました:

create type product_status as (product varchar(255), status varchar(255))

次に、クエリを作成しました。

select pivot.*
from crosstab(
    $$
    select
        uniqueid,
        (product, status)::product_status,
        count(*)
    from policycase
    inner join policy
    on policy.id = policycase.selected_id
    group by 1,2
    order by 1,2
    $$,
    $$
    values(
--          ('(HOUSEFIRE,HISTORICAL)'::product_status),
--          ('(HOUSECONTENT,HISTORICAL)'::product_status),
         ('(LIABILITY,ARCHIVED)'::product_status)
    )
    $$
) as pivot (
    uniqueid bigint,
--     housefire_hist smallint,
--     housecontent_hist smallint,
    liability_Arch smallint
)

これは機能し、正しい結果が返されます。ただし、上記の例のコメント行をコメント解除すると、次のエラーメッセージが表示されます。

[例外、エラーコード0、SQLState 42601]エラー:提供された「カテゴリ」SQLは、少なくとも1行1列1列の1列を返す必要があります

2つのテーブルが使用されます。

Policycaseには、id、selected_id、およびstatusがあります。

ポリシーにはid、uniqueid、productがあります

2
Martijn Burger

ここでのvalues句:

values(
          ('(HOUSEFIRE,HISTORICAL)'::product_status),
          ('(HOUSECONTENT,HISTORICAL)'::product_status),
         ('(LIABILITY,ARCHIVED)'::product_status)
    )

次のように、3列の1行を生成しますが、1列の3行が必要です。

values   ('(HOUSEFIRE,HISTORICAL)'::product_status),
         ('(HOUSECONTENT,HISTORICAL)'::product_status),
         ('(LIABILITY,ARCHIVED)'::product_status)
2
Daniel Vérité