Diberikan dua tabel dengan jumlah baris yang tidak ditentukan dengan nama dan nilai, bagaimana saya akan menampilkan pivot CROSS JOINdari fungsi di atas nilainya.
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Misalnya, jika fungsi itu adalah perkalian, bagaimana saya menghasilkan tabel (perkalian) seperti di bawah ini,
Semua (arg1,arg2,result)baris tersebut dapat dibuat dengan
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Jadi ini hanya masalah presentasi, saya ingin ini juga bekerja dengan nama kustom - nama yang tidak hanya argumen CASTed ke teks tetapi diatur dalam tabel,
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT chr(x+72) AS name, x::int
FROM generate_series(1,5) AS t(x);
Saya pikir ini akan mudah dilakukan dengan CROSSTAB yang mampu tipe kembali yang dinamis.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
', 'SELECT DISTINCT name FROM bar'
) AS **MAGIC**
Tapi, tanpa itu **MAGIC**, aku mengerti
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Untuk referensi, menggunakan contoh di atas dengan nama ini adalah sesuatu yang lebih seperti apa tablefunc's crosstab()keinginan.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
'
) AS t(row int, i int, j int, k int, l int, m int);
Tapi, sekarang kita kembali membuat asumsi tentang konten dan ukuran bartabel dalam contoh kita. Jadi jika,
- Tabel panjangnya tidak ditentukan,
- Kemudian cross-join mewakili kubus dimensi yang tidak ditentukan (karena di atas),
- Nama-nama katagori (istilah tabulasi silang) ada di tabel
Apa yang terbaik yang dapat kita lakukan di PostgreSQL tanpa "daftar definisi kolom" untuk menghasilkan presentasi seperti itu?
