#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;