Эквивалент Coalece для n-го не нулевого значения - MySQL

Я отрывал свои волосы от этой проблемы. Я работаю с существующим набором данных и должен удалить все нулевые значения из столбцов таблицы A и шунтировать их по всему так, чтобы они были упорядочены, как в таблице B

Мне нужно что-то, что эквивалентно Coalesce, но для получения n-го значения, чтобы я мог получить результат, отсортированный, как в таблице B

Что у меня есть:

Таблица A

Name CURRENT OCT12 SEPT12 AUG12 JUL12 JUN12  MAY12 APR12
---------------------------------------------------------
A    NULL    NULL  Aug-12 NULL  NULL  Jun-12 NULL  Apr-12
B    Nov-12  NULL  Aug-12 NULL  Jul-12Jun-12 NULL  Apr-12

Что мне нужно:

Таблица B

Name Change1 Change2 Change3 Change4 Change5 Change6
----------------------------------------------------
A    Aug-12  Jun-12  Apr-12  NULL    NULL    NULL   
B    Nov-12  Aug-12  Jul-12  Jun-12  Apr-12  NULL

По коду, это было бы примерно так:

Select

first non-null value as Change1  
,second non-null value as Change2  
,third non-null value as Change3  
,fourth non-null value as Change4  
,fifth non-null value as Change5...etc..  

from Table_A

Я использую MySQL, и я понятия не имею, как ссылаться на n-ое ненулевое значение, чтобы вызвать их в Table_B

У кого-нибудь есть идеи?

1
nl ja de
Возможно, вы также должны показать свой запрос. Трудно понять, чего вы хотите.
добавлено автор Ja͢ck, источник
Нормализовать ваши данные?
добавлено автор Strawberry, источник
это означает, что каждый месяц помещается в строку, а не в столбцы? проблема в том, что каждый разный месяц в этом случае происходит из другой исходной таблицы. Моя проблема, вероятно, в том, что я использовал запрос кода, хранящегося в базах данных, но мне никогда не приходилось создавать базу данных с нуля, поэтому мои навыки страдают в этом отношении :(
добавлено автор Shereena, источник
У меня нет запроса на получение данных, вот что мне нужно. Я могу использовать Coalesce, чтобы вытащить первое ненулевое значение из таблицы A в столбец Change1 в таблице B, и я могу использовать свернутый оператор case для извлечения второго непустого значения из таблицы A в таблицу B. Моя проблема возникает при попытке для получения третьего, четвертого, пятого не нулевого значения, я не думаю, что код используется для извлечения их из таблицы A в таблицу B ...
добавлено автор Shereena, источник

1 ответы

Я не уверен, что я рекомендую использовать это решение ... нормализация ваших данных всегда является лучшим выбором, но я хотел бы ответить, используя простой SQL с некоторыми функциями строк. Этот запрос должен вернуть то, что вы ищете:

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

Я конкатенирую все значения в строке, разделенной запятыми, с двумя запятыми в конце строки (одной запятой было бы достаточно в любом случае, но проще поставить два и просто игнорировать последний ...), а так как я ' m, используя CONCAT_WS, он автоматически пропустит нулевые значения, а результирующая строка будет выглядеть как Aug-12, Jun-12, Apr-12 , .

Затем во внешнем запросе я извлекаю n-й элемент строки, используя SUBSTRIG_INDEX. Я бы рекомендовал нормализовать вашу базу данных, но если вам нужно быстро исправить это решение, возможно, станет хорошей отправной точкой.

Смотрите здесь здесь .

Обратите внимание, что я не возвращаю значения NULL, где нет изменений, но вместо этого я возвращаю пустые строки. Это может быть изменено, если вам нужно.

0
добавлено
Это решение работало отлично, спасибо за помощь! Спасибо за совет дизайн базы данных RE, я буду иметь это в виду для моих собственных баз данных в будущем :)
добавлено автор Shereena, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw