
レコード型の使用方法がわからないので、悪戦苦闘しております。。。
【やりたいこと】
・あるテーブルのある項目でGROUP BYし、別の項目事に集計した結果を
カラムとして出力
クロス集計と呼ぶのでしょうか?
上記の結果表を取得出来るFUNCTIONを作成したいのです。
【サンプルデータ】
CREATE TABLE t1 (
col1 integer
,col2 integer
,val integer
);
INSERT INTO t1 VALUES( 1, 1, 1, );
INSERT INTO t1 VALUES( 1, 1, 1, );
INSERT INTO t1 VALUES( 2, 1, 1, );
INSERT INTO t1 VALUES( 2, 1, 1, );
INSERT INTO t1 VALUES( 3, 2, 1, );
INSERT INTO t1 VALUES( 3, 2, 1, );
INSERT INTO t1 VALUES( 4, 2, 1, );
INSERT INTO t1 VALUES( 4, 2, 1, );
※ここでcol1、col2ともどんなデータが入っているか、わからないとします。
なので、まずcol2をDISTINCTしたものを求めました。
SELECT DISTINCT col2 FROM t1;
この結果をカーソルを使ってループし、動的にカラムを作成するSQLを
作りました。
DECLARE
cu refcursor;
rec record;
str text := 'SELECT col1 ';
str2 text := ' FROM t1 GROUP BY col1 ORDER BY col1';
BEGIN
OPEN cu FOR EXECUTE SELECT DISTINCT col2 FROM t1;
LOOP
FETCH cu INTO rec;
IF NOT FOUND THEN EXIT;
END IF;
str := str || ', SUM( CASE WHEN col2 = rec.col2 THEN val END )
AS col_name' || rec.col2;
END LOOP;
CLOSE cu;
RAISE INFO 'key = %', str || str2;
動的に生成されたSQLを実行したい
-------------------------------------------------------
※ちなみに動的に生成されたSQLはこんな感じになります。
SELECT col1
,SUM( CASE WHEN col2 = 1 THEN val END ) AS col_name1
,SUM( CASE WHEN col2 = 2 THEN val END ) AS col_name2
FROM t1
GROUP BY col1
ORDER BY col1;
-------------------------------------------------------
あとがわかりません。。動的なカラムなので、どうやって取得すれば
良いのでしょうか?
レコード型を使うと上手くいくのでしょうか?
試しにFUNCTION( func1 )の戻り値をRETURNS SETOF record として
内部で
rec1 record;
:
:
FOR rec1 IN EXECUTE str || str2
LOOP
RETURN NEXT rec1;
END LOOP;
RETURN;
SELECT * FROM func1();
とやってみたら、
ERROR: a column definition list is required for functions returning "record"
となります。。。
カラムの定義が必要だと言われているんだと思いますが、カラムは
動的になっているので、どうすれば良いのでしょうか??
No.1ベストアンサー
- 回答日時:
>※ちなみに動的に生成されたSQLはこんな感じになります。
>SELECT col1
>,SUM( CASE WHEN col2 = 1 THEN val END ) AS col_name1
>,SUM( CASE WHEN col2 = 2 THEN val END ) AS col_name2
>FROM t1
>GROUP BY col1
>ORDER BY col1;
int,int,intと3個を列として受け渡したいのだから、次のようなユーザデータ型を定義します。
CREATE TYPE test_type -- (INT,INT,INT)の3項目の受け渡し用
AS
(a INT,
b INT,
c INT);
そして、このユーザ定義型の変数で、受け渡しができると思います。
この回答への補足
ありがとうございます。
今回は、受け取りたい列数が可変なのです。
SELECT DISTINCT col2 FROM t1;
上記のSQLで得られる結果を列にしたいのです。
例)
1000
2100
3500
---
3 rows
ならば、列は
col_name1000, col_name2100, col_name3500としたいのです。
※クロス集計する列を可変で行いたいと考えています
・・・やっぱりムリなんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- PHP php エラー 2 2022/10/23 16:43
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- PHP php エラー 3 2022/11/18 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで縦のカラムデータを...
-
自治会総会の成立要件について
-
Windows10がインストールできま...
-
SQLでUPSERTを一度に複数行やる...
-
plgファイルの開き方
-
PostgreSQLとmysqlはどちらを選...
-
レンタルサーバーのPostgreSQL...
-
postgresqlでのトランザクショ...
-
直近2年度連続で減少していない...
-
列が存在しないと言われる
-
postgreSQLのint型は桁数指定が...
-
postgresql についてです
-
PostgreSQL14.6のSSL対応について
-
PuTTyにログインまでは出来たの...
-
PostgreSqlでFunctionの作成に...
-
ウィンドウズ10へアップロー...
-
PostgresSQLの環境設定について
-
mplabの事です。 2年くらい前に...
-
Windows10でQuickTimeがインス...
-
select文の書き方「半角カナ+...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自治会総会の成立要件について
-
postgresql についてです
-
postgreSQLのint型は桁数指定が...
-
SQLでUPSERTを一度に複数行やる...
-
plgファイルの開き方
-
SQLにて指定日付より前、かつ最...
-
select文の書き方「半角カナ+...
-
エクセルで縦のカラムデータを...
-
PostgreSqlでFunctionの作成に...
-
postgresqlでのトランザクショ...
-
新規作成したPostgresqlデータ...
-
select文の書き方で分からない...
-
列が存在しないと言われる
-
PostgreSQLについて教えてくだ...
-
shellからpostgresqlへの変数の...
-
Windows10でQuickTimeがインス...
-
Postgreのupdateコマンドでエラー
-
bashスクリプトでpostgreSQLの...
-
Windows10がインストールできま...
-
PostgresSQLの環境設定について
おすすめ情報