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

Efecto inesperado del filtrado en el resultado de la consulta crosstab()

extra1, extra2, ... son "columnas adicionales" en terminología de tabulación cruzada.
El manual del módulo tablefunc explica las reglas:

Y más abajo:

Énfasis audaz en las partes clave por mí.

Solo ordena por row_name :

ORDER  BY row_name ASC

No importa en el primer ejemplo donde filtras con:

WHERE ... t.extra1 = 'val1'  -- single quotes by me

Todas las filas de entrada tienen extra1 = 'val1' de todos modos. Pero importa en el segundo ejemplo donde filtras con:

WHERE ... t.extra1 IN('val1', ...) --> More values

Ahora, el primer requisito en negrita anterior se viola para la columna adicional extra1 . Si bien el orden de clasificación de la primera consulta de entrada no es determinista, los valores resultantes para la columna "extra" extra1 son elegidos arbitrariamente. Los valores más posibles para extra1 , menos filas terminarán teniendo 'val1':eso es lo que observaste.

Todavía puede hacer que funcione:para informar extra1 = 'val1' para cada row_name que tiene al menos uno de esos, cambie el ORDER BY a:

ORDER  BY row_name, (extra1 <> 'val1')

Ordena 'val1' en la parte superior. Explicación para ese boolean expresión (con enlaces a más):

Otras columnas "extra" todavía se eligen arbitrariamente mientras que el orden de clasificación no es determinista.

Conceptos básicos de tabulación cruzada: