extra1, extra2, ...
são "colunas extras" na terminologia de crosstab.O manual para o módulo tablefunc explica as regras:
E mais abaixo:
Ênfase em negrito em partes-chave por mim.
Você só classifica por
row_name
:ORDER BY row_name ASC
Não importa no primeiro exemplo em que você filtra com:
WHERE ... t.extra1 = 'val1' -- single quotes by me
Todas as linhas de entrada têm
extra1 = 'val1'
de qualquer forma. Mas é importante no segundo exemplo em que você filtra com:WHERE ... t.extra1 IN('val1', ...) --> More values
Agora, o primeiro requisito em negrito acima foi violado para a coluna extra
extra1
. Embora a ordem de classificação da primeira consulta de entrada não seja determinística, os valores resultantes para a coluna "extra" extra1
são escolhidos arbitrariamente. Os valores mais possíveis para extra1
, menos linhas acabarão tendo 'val1':foi isso que você observou. Você ainda pode fazê-lo funcionar:para reportar
extra1 = 'val1'
para cada row_name
que tenha pelo menos um desses, altere o ORDER BY
para:ORDER BY row_name, (extra1 <> 'val1')
Classifica 'val1' no topo. Explicação para esse
boolean
expressão (com links para mais):Outras colunas "extras" ainda são escolhidas arbitrariamente enquanto a ordem de classificação não é determinística.
Noções básicas de crosstab:
- Consulta de tabela cruzada do PostgreSQL
- tab cruzada Postgresql consulta com várias colunas "nome da linha"