sql >> Base de Datos >  >> RDS >> PostgreSQL

Genera columnas dinámicamente en PostgreSQL

La consulta de tabulación cruzada básica para su ejemplo es simple:

SELECT * FROM crosstab(
       'SELECT zoom, day, point
        FROM   province
        ORDER  BY 1, 2'

     , $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);

Pero no con nombres de columna dinámicos o un número dinámico de columnas. Como compromiso, puede tener un número fijo de columnas y solo llenar las primeras. Conceptos básicos:

  • Consulta de tabulación cruzada de PostgreSQL

¿Dinámico?

crosstab_hash no lo ayudará con los nombres de las columnas dinámicas. Es para uso repetido sin escribir una lista de definición de columna, pero no para dinámico nombres de columna Ejemplos:

  • Genera columnas dinámicamente para tabulaciones cruzadas en PostgreSQL
  • Sql:transposición de filas en columnas

Para nombres de columna verdaderamente dinámicos, necesita dos viajes de ida y vuelta al servidor. Ya sea que recupere los nombres de las columnas con una primera consulta para generar una segunda consulta, o cree un cursor, una tabla temporal o una declaración preparada. Intente lo que intente, necesita dos viajes de ida y vuelta. SQL quiere saber el tipo de devolución en el momento de la llamada.

Lo más cerca que pude estar de una llamada "dinámica" es con mi crosstab_n() personalizado función definida en esta respuesta relacionada:

  • Alternativa dinámica a pivotar con CASE y GROUP BY

O renuncia a la idea de una consulta de tabulación cruzada completamente dinámica (porque, ya sabe, es imposible) y utiliza un flujo de trabajo de dos pasos, como se mencionó anteriormente.

  1. Deje que una función genere el texto de consulta de tabla cruzada. Puede utilizar la función proporcionada aquí (¡y adaptarla a sus necesidades!):

    • Ejecutar una consulta de tabulación cruzada dinámica

    En particular, elimine GROUP BY 1, 2 , ya que no agrega filas antes de la tabulación cruzada.

  2. Ejecuta la función generada.

Para completar, también está el nuevo \crosstabview metacomando en psql en Postgres 9.6 (recién lanzado) - con una funcionalidad similar, y puede mostrar nombres de columnas dinámicas (adjuntar nombres dinámicos ocurre en el cliente psql, no en el servidor Postgres).