初めに
Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。
\crosstabviewとは
問い合わせのバッファを実行し(
\g
と同様)、その結果をクロス表形式で表示します。 問い合わせは少なくとも3つの列を返す必要があります。colV
で特定される出力列が縦方向のヘッダになり、colH
で特定される出力列が横方向のヘッダになります。colD
は表内に表示される出力列を特定します。 オプションの*sortcolH*
で水平方向のヘッダをソートする列を指定できます。それぞれの列の指定は、列番号(1から始まります)でも列名でも可能です。 列名については、通常のSQLの大文字小文字変換および引用の規則が適用されます。 省略した場合、
colV
は列1、colH
は列2となります。colH
はcolV
とは異なるものでなければなりません。colD
を指定しない場合、問い合わせの結果にはちょうど3つの列がなければならず、colV
でもcolH
でもない列がcolD
となります。縦方向のヘッダは一番左の列に表示され、
colV
の列にある値が問い合わせ結果と同じ順序で現れますが、重複するものは除かれます。横方向のヘッダは1行目に表示され、
colH
の列にある値が現れますが、重複するものは除かれます。 デフォルトでは、これらは問い合わせの結果と同じ順序で表示されます。 しかしオプションのsortcolH
引数が指定された場合は、colH
の値は対応するsortcolH
の値に従ってソートされて横方向のヘッダに現れますが、sortcolH
の列の値は整数値でなければなりません。クロス表の内側では、
colH
のそれぞれの個別値x
とcolV
のそれぞれの個別値y
に対して、その交点(x,y)
に位置するセルに、問い合わせの結果のcolH
の値がx
でcolV
の値がy
である行のcolD
列の値が現れます。 そのような行がなければ、セルは空欄になります。 そのような行が複数あると、エラーが報告されます。
試してみた
まずはデータの用意
CREATE TABLE sales (
region TEXT,
product TEXT,
sales_amount INTEGER
);
INSERT INTO sales (region, product, sales_amount) VALUES
('North', 'Product A', 100),
('North', 'Product B', 150),
('South', 'Product A', 200),
('South', 'Product B', 250);
まずは普通にSELECT
postgres=# SELECT region, product, sales_amount FROM sales ORDER BY 1,2;
region | product | sales_amount
--------+-----------+--------------
North | Product A | 100
North | Product B | 150
South | Product A | 200
South | Product B | 250
(4 rows)
\crosstabviewを使ってみる
postgres=# \crosstabview region product
region | Product A | Product B
--------+-----------+-----------
North | 100 | 150
South | 200 | 250
(2 rows)
まとめ
クロス表形式と聞いて難しい印象でしたが、使ってみると実務にも活かせそう。
すぐには思いつきませんが。。