Как последовательно добавить имя отсутствующего месяца в таблицу sql, проверив имя предыдущего месяца?

#mysql #sql #mysql-workbench

Вопрос:

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

Код для создания таблицы:

 CREATE TABLE IF NOT EXISTS missing_months (  `Cust_id` INT,  `Month` VARCHAR(9) CHARACTER SET utf8,  `Sales_value` INT ); INSERT INTO missing_months VALUES  (1,'Janurary',224),  (2,'February',224),  (3,NULL,239),  (4,'April',205),  (5,NULL,218),  (6,'June',201),  (7,NULL,205),  (8,'August',246),  (9,NULL,218),  (10,NULL,211),  (11,'November',223),  (12,'December',211);  

выход есть:

 Cust_id Month Sales_value  1 Janurary 224  2 February 224  3 null 239  4 April 205  5 null 218  6 June 201  7 null 205  8 August 246  9 null 218  10 null 211  11 November 223  12 December 211  

НО Я ХОЧУ, ЧТОБЫ РЕЗУЛЬТАТ БЫЛ ТАКИМ:

 Cust_id Month Sales_value  1 Janurary 224  2 Febrauary 224  3 March 239  4 April 205  5 May 218  6 June 201  7 July 205  8 August 246  9 September 218  10 October 211  11 November 223  12 December 211  

Комментарии:

1. вам нужно решение только на SQL ? вы можете исправить отсутствующее значение, прежде чем вставлять его в базу данных

2. Относится ли cust_id к номеру месяца?

3. @Фил Коулсон, Нет, это относится к серийному номеру, просто идентификаторы, такие как 101,102 и т. Д

Ответ №1:

 update missing_months m join missing_months prev on prev.Cust_id=m.Cust_id-1 set m.Month=date_format(str_to_date(concat(prev.Month,'-1970-01'),'%M-%Y-%d')   interval 1 month,'%M') where m.Month is null order by m.Cust_id  

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

Ответ №2:

 select Cust_id, monthname(STR_TO_DATE(rn, '%m')) as Month_Name,  Sales_value  from  (Select Cust_id, Month, row_number() over() as rn,  Sales_value   from missing_month) x;