#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. хахах, хорошо, я виноват, но что бы я ни опубликовал, вы просто замените его предложением «ЗАМЕНИТЬ», и произойдет волшебство