sql >> Base de Datos >  >> RDS >> Mysql

Fusionar equivalente para n-ésimo valor no nulo - MySQL

No estoy seguro si recomendaría usar esta solución... la normalización de sus datos siempre es una mejor opción, pero quería responder usando SQL simple con algunas funciones de cadenas. Esta consulta debería devolver lo que está buscando:

SELECT
  Name,
  Changes,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
  SELECT
    Name,
    CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
  FROM
    TableA
) s

Estoy concatenando todos los valores en una cadena separada por comas, con dos comas al final de la cadena (una coma sería suficiente de todos modos, pero es más fácil poner dos e ignorar la última...), y como Si uso CONCAT_WS, automáticamente omitirá los valores nulos y la cadena resultante será algo así como Aug-12,Jun-12,Apr-12,, .

Luego, en la consulta externa, estoy extrayendo el n-ésimo elemento de la cadena, usando SUBSTRIG_INDEX. Recomendaría normalizar su base de datos, pero si necesita una solución rápida, esta solución podría ser un buen punto de partida.

Véalo funcionando aquí .

Tenga en cuenta que no devuelvo valores NULOS donde no hay cambios, sino que devuelvo cadenas vacías. Esto se puede cambiar si lo necesita.