Je souhaite créer une colonne dérivée comme indiquée ci-dessous sans utiliser J'ai les colonnes if-ele code> déclarations. P>
x, y, z code> qui sont toutes les dates. Je veux obtenir une quatrième colonne qui affiche l'ordre des champs dans ascendance code> sans utiliser si-ele ou case quand code>. Est-ce possible? P>
3 Réponses :
Pour chacun des x code>, y code>, z code> colonnes Sélectionnez le caractère correspondant littéral, l'alias de colonne à un nom commun et l'autre colonnes comme elles sont. Syndicat les résultats. Sélectionnez maintenant les autres colonnes de l'Union et utilisez group_concat () code> avec une commande par code> expression pour obtenir la liste triée. SELECT x.s_n,
x.x,
x.y,
x.z,
group_concat(x.c
ORDER BY x.d) derived_column
FROM (SELECT t.s_n,
t.x,
t.y,
t.z,
'x' c,
t.x d
FROM elbat t
UNION ALL
SELECT t.s_n,
t.x,
t.y,
t.z,
'y' c,
t.y d
FROM elbat t
UNION ALL
SELECT t.s_n,
t.x,
t.y,
t.z,
'z' c,
t.z d
FROM elbat t) x
GROUP BY x.s_n,
x.x,
x.y,
x.z;
Dans votre exemple de données, je suppose que le résultat de la ligne 3D est Voir le Démo a > p> p> 'z, y, x' code> non?
Faire cela sans agrégation est plutôt difficile. Mais c'est possible. Bien sûr, le véritable défi consiste à obtenir l'élément moyen - en particulier sans cas code> ou si () code>. Cependant, ce n'est qu'un défi. select elt(field(concat(highest, lowest), 'xy', 'xz', 'yz', 'yx', 'zx', 'zy'), 'x,z,y', 'x,y,z', 'y,x,z', 'y,z,x', 'z,y,x', 'z,x,y')
from (select t.*,
elt(field(greatest(x, y, z), x, y, z), 'x', 'y', 'z') as highest,
elt(field(least(x, y, z), x, y, z), 'x', 'y', 'z') as lowest
from (select 'a' as a, 1 as x, 2 as y, 3 as z union all
select 'b' as a, 4 as x, 2 as y, 3 as z
) t
) t