-1
votes

Colonne dérivée qui contient les noms de colonne triés par date

Je souhaite créer une colonne dérivée comme indiquée ci-dessous sans utiliser if-ele déclarations.

 Entrez la description de l'image ici

J'ai les colonnes x, y, z qui sont toutes les dates. Je veux obtenir une quatrième colonne qui affiche l'ordre des champs dans ascendance sans utiliser si-ele ou case quand . Est-ce possible?


0 commentaires

3 Réponses :


0
votes

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;


0 commentaires

1
votes

Dans votre exemple de données, je suppose que le résultat de la ligne 3D est 'z, y, x' non?
xxx

Voir le Démo


0 commentaires

1
votes

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


0 commentaires