レコード型の使用方法がわからないので、悪戦苦闘しております。。。
【やりたいこと】
・あるテーブルのある項目で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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0の除算
-
alter tableすると、処理が止ま...
-
constraint と index の違い
-
列が存在しないと言われる
-
SQLite:項目が存在しない場合の...
-
長いSQL文を実行するには?
-
INSERTできるレコード数を制限...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
Access テキスト型に対する指定...
-
BLOB型のPDF出力の方法
-
ACCESSのクエリで集計で、先頭...
-
作番ってどういう意味でしょうか?
-
エクセルグラフの凡例スペース
-
アクセス メモ型 255文字...
-
Oracle 2つのDate型の値の差を...
-
accessで重複を防ぎたい
-
Accessのリンクテーブルのパス...
-
Accessでテーブル名やクエリ名...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
PostgreSQLで表結合+DELETEしたい
-
0の除算
-
長いSQL文を実行するには?
-
alter tableすると、処理が止ま...
-
INSERTできるレコード数を制限...
-
constraint と index の違い
-
DBから日付順に指定件数の削除...
-
COPY時のtimestamp型について
-
動的に生成したカラムを使ったF...
-
Null値を無視してユニークにしたい
-
postgreSQLの日付を変数にする...
-
INSERTできない
-
SQLite:項目が存在しない場合の...
-
大量データを更新したら、処理...
-
DB2 「既存カラムへのnot null...
-
複数キーワードでのあいまい検索
-
SQLで特定データがNULLなら別デ...
-
powergres(postgres)にalter文...
-
DB2でUNIQUE制約を削除したい
おすすめ情報