extra1, extra2, ...
sont des "colonnes supplémentaires" dans la terminologie du tableau croisé.
Le manuel du module tablefunc
explique les règles :
Et plus bas :
J'insiste audacieusement sur les éléments clés.
Vous ne triez que par row_name
:
ORDER BY row_name ASC
Peu importe dans le premier exemple où vous filtrez avec :
WHERE ... t.extra1 = 'val1' -- single quotes by me
Toutes les lignes d'entrée ont extra1 = 'val1'
De toute façon. Mais c'est important dans le deuxième exemple où vous filtrez avec :
WHERE ... t.extra1 IN('val1', ...) --> More values
Maintenant, la première exigence en gras ci-dessus n'est pas respectée pour la colonne supplémentaire extra1
. Bien que l'ordre de tri de la première requête d'entrée soit non déterministe, les valeurs résultantes pour la colonne "extra" extra1
sont choisis arbitrairement. Plus de valeurs possibles pour extra1
, moins de lignes finiront par avoir 'val1' :c'est ce que vous avez observé.
Vous pouvez toujours le faire fonctionner :pour signaler extra1 = 'val1'
pour chaque row_name
qui en a au moins un, changez le ORDER BY
à :
ORDER BY row_name, (extra1 <> 'val1')
Trie 'val1' en premier. Explication pour ce boolean
expression (avec des liens vers plus):
D'autres colonnes "supplémentaires" sont toujours choisies arbitrairement alors que l'ordre de tri n'est pas déterministe.
Principes de base du tableau croisé :