Étant donné deux tables avec un nombre de lignes non défini avec un nom et une valeur, comment afficher un pivot CROSS JOIN
d'une fonction sur leurs valeurs.
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);
Par exemple, si cette fonction était une multiplication, comment générer une table (de multiplication) comme celle ci-dessous,
Toutes ces (arg1,arg2,result)
lignes peuvent être générées avec
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Donc, ce n'est qu'une question de présentation, je voudrais que cela fonctionne également avec un nom personnalisé - un nom qui n'est pas simplement l'argument CAST
édité dans le texte mais défini dans le tableau,
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);
Je pense que ce serait facilement faisable avec un CROSSTAB capable d'un type de retour dynamique.
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**
Mais, sans le **MAGIC**
, je reçois
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Pour référence, en utilisant les exemples ci-dessus avec des noms, cela ressemble plus à ce que tablefunc
l'on crosstab()
veut.
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);
Mais, maintenant nous sommes de retour à faire des hypothèses sur le contenu et la taille de la bar
table dans notre exemple. Donc si,
- Les tables sont de longueur indéfinie,
- Ensuite, la jointure croisée représente un cube de dimension indéfinie (à cause de ci-dessus),
- Les noms de catégories (langage croisé) sont dans le tableau
Que pouvons-nous faire de mieux dans PostgreSQL sans une "liste de définitions de colonnes" pour générer ce type de présentation?