Как обрабатывать одинаковые ОДИНАКОВЫЕ записи в базе данных как один в группе By

#mysql #database

#mysql #База данных

Вопрос:

Я пытаюсь выполнить запрос Mysql, чтобы сгруппировать все одинаковые записи в базе данных как одну.У меня есть база данных с разными названиями цветов, записи в базе данных похожи

 Contract        Color

OG-46374    I.Khaki
OG-46375    I-KHAKI
OG-46376    I KHAKI
OG-46377    W Ocher
OG-46378    W.Ocher
  

Теперь проблема заключается в том, что моя база данных обрабатывает все эти значения как разные записи, в то время как я не могу обработать или заставить оператора записывать точные значения. как я могу обрабатывать все цвета «I хаки» и W охра как один, а не разные цвета в предложении group by
Мой Sql-запрос как-то похож

 SELECT 
    *,
    ROUND(SUM(meter_yard_length), 0) AS TotaL_Length_Contract,
    ROUND(SUM(IF(quality = 'A', meter_yard_length, 0)),
            0) AS A_Quality_length,
    ROUND(SUM(IF(quality = 'B', meter_yard_length, 0)),
            0) AS B_Quality_length GROUP BY r.contract_no, r.color DESC;
  

Пожалуйста, сообщите общее решение, потому что у меня есть много возможностей, таких как «Я * хаки», «Я-хаки» и т. Д. Я не могу контролировать их все с помощью replace и т. Д

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

1. Не будет «общего» решения, которое исправит все ваши неверные данные. Исправьте свою систему так, чтобы она принимала только правильные значения, предпочтительно таблицу цветов с именем, а затем сохраняйте идентификатор цвета в своей таблице.

Ответ №1:

Этот ответ основан на очень ограниченных образцах данных, которые вы предоставили. Я вижу две проблемы с названиями цветов. Во-первых, не все буквы всегда находятся в одном и том же регистре. И, во-вторых, в данной позиции может быть пробел, точка или тире, когда на самом деле все три представляют одно и то же логическое имя. Мы можем попробовать использовать REPLACE для преобразования точек и тире в пробел, а затем использовать LOWER() для решения проблемы с обращением.

 SELECT 
    contract_no,
    LOWER(REPLACE(REPLACE(color, '.', ' '), '-', ' '))
    ROUND(SUM(meter_yard_length), 0) AS TotaL_Length_Contract,
    ROUND(SUM(IF(quality = 'A', meter_yard_length, 0)),
        0) AS A_Quality_length,
    ROUND(SUM(IF(quality = 'B', meter_yard_length, 0)),
        0) AS B_Quality_length
FROM yourTable
GROUP BY
    contract_no,
    LOWER(REPLACE(REPLACE(color, '.', ' '), '-', ' '));
  

ДЕМОНСТРАЦИЯ

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

1. Я прошу общего решения, и да, это ограниченные данные, потому что я не могу опубликовать здесь всю свою базу данных, может быть ‘.’ или ‘-‘ или пробел или любая другая возможность, что я могу сделать, если у меня есть имя цвета, у которого нет . или — но в нижнем регистре имежду ними есть ‘*’, чем? пожалуйста, сообщите общее решение, например, если я использую khaki с INSTR, оно показывает мне все цвета, имеющие цвет хаки, но проблема в том, что я не могу жестко закодировать только цвет хаки, поэтому не использую INSTR по этой причине

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

3. хахах, хорошо, я виноват, но что бы я ни опубликовал, вы просто замените его предложением «ЗАМЕНИТЬ», и произойдет волшебство