extra1, extra2, ...
to "dodatkowe kolumny" w terminologii crosstab.
Podręcznik modułu tablefunc
wyjaśnia zasady:
I dalej w dół:
Odważny nacisk na kluczowe części przeze mnie.
Sortujesz tylko według row_name
:
ORDER BY row_name ASC
Nie ma znaczenia w pierwszym przykładzie, gdzie filtrujesz za pomocą:
WHERE ... t.extra1 = 'val1' -- single quotes by me
Wszystkie wiersze wejściowe mają extra1 = 'val1'
w każdym razie. Ale ma to znaczenie w drugim przykładzie, w którym filtrujesz za pomocą:
WHERE ... t.extra1 IN('val1', ...) --> More values
Teraz pierwszy pogrubiony wymóg powyżej jest naruszony dla dodatkowej kolumny extra1
. Chociaż porządek sortowania pierwszego zapytania wejściowego nie jest deterministyczny, wynikowe wartości kolumny „extra” extra1
są wybierane arbitralnie. Więcej możliwych wartości dla extra1
, mniej wierszy będzie miało „wartość1”:to właśnie zaobserwowałeś.
Nadal możesz sprawić, by to działało:zgłosić extra1 = 'val1'
dla każdego row_name
który ma co najmniej jeden z nich, zmień ORDER BY
do:
ORDER BY row_name, (extra1 <> 'val1')
Sortuje 'val1' na górze. Wyjaśnienie dla tego boolean
wyrażenie (z linkami do innych):
Inne „dodatkowe” kolumny są nadal wybierane arbitralnie, podczas gdy porządek sortowania nie jest deterministyczny.
Podstawy tabeli krzyżowej:
- Zapytanie do tabeli krzyżowej PostgreSQL
- Postgresql crosstab zapytanie z wieloma kolumnami „nazwa wiersza”