Ad ve değer içeren tanımsız satır sayısına sahip iki tablo göz önüne alındığında CROSS JOIN
, bir işlevin değerlerinin üzerinde bir özetini nasıl görüntüleyeceğim .
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);
Örneğin, bu işlev çarpma olsaydı, aşağıdaki gibi bir (çarpma) tablosu nasıl oluştururum,
Bu (arg1,arg2,result)
satırların tümü aşağıdakilerle oluşturulabilir
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Yani bu sadece bir sunum meselesi, bunun da özel bir adla çalışmasını istiyorum - sadece CAST
metinde düzenlenen argüman değil, tabloda ayarlanan bir ad ,
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);
Bence bu dinamik bir dönüş tipi yapabilen bir CROSSTAB ile kolayca yapılabilir.
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**
Ama, olmadan **MAGIC**
, anladım
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Başvuru için, adları ile yukarıdaki örneklerle bu daha fazla ne gibi bir şeydir tablefunc
'ın crosstab()
istek.
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);
Ancak, şimdi bar
örneğimizde tablonun içeriği ve boyutu hakkında varsayımlar yapmaya geri döndük . Yani,
- Tablolar tanımlanmamış uzunluktadır,
- Daha sonra çapraz birleştirme, tanımlanmamış boyutta bir küpü temsil eder (yukarıdaki nedeniyle),
- Katagori adları (sekmeler arası parlance) tabloda
Bu tür bir sunum oluşturmak için "sütun tanımlama listesi" olmadan PostgreSQL'de yapabileceğimiz en iyi şey nedir?