Dadas dos tablas con un recuento de filas indefinido con un nombre y un valor, ¿cómo mostraría CROSS JOIN
una función pivotada sobre sus valores?
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);
Por ejemplo, si esa función fuera la multiplicación, ¿cómo generaría una tabla (de multiplicación) como la siguiente?
Todas esas (arg1,arg2,result)
filas se pueden generar con
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Entonces, esto es solo una cuestión de presentación, me gustaría que esto también funcione con un nombre personalizado , un nombre que no es simplemente el argumento CAST
editado en texto, sino que se establece en la tabla,
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);
Creo que esto sería fácilmente posible con un CROSSTAB capaz de un tipo de retorno dinámico.
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**
Pero, sin el **MAGIC**
, me sale
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
A modo de referencia, utilizando los ejemplos anteriores, con nombres que esto es algo más parecido a lo que tablefunc
's crosstab()
necesidades.
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);
Pero, ahora volvemos a hacer suposiciones sobre el contenido y el tamaño de la bar
tabla en nuestro ejemplo. Así que si,
- Las tablas son de longitud indefinida,
- Entonces la unión cruzada representa un cubo de dimensión indefinida (debido a lo anterior),
- Los nombres de categoría (lenguaje de tabla cruzada) están en la tabla
¿Qué es lo mejor que podemos hacer en PostgreSQL sin una "lista de definición de columnas" para generar ese tipo de presentación?