У вас есть пара проблем - кроме необходимости group by
, ваш подзапрос повторяет логику вашего внешнего запроса.И что еще более важно, ваш внешний запрос, похоже, выполняет декартово (перекрестное) соединение между Msg_Log и item_cbo - он объединяет их без условий .Если в item_cbo
больше 1 строки, вы, вероятно, получите гораздо больше результатов, чем хотели бы.
Без каких-либо данных из вашей таблицы, я думаю, что-то здесь, но я бы переписал это какэто:
SELECT
substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3)) Código,
SUM(to_number(substr(ML.msg, -9))) qtd
FROM Msg_log ML,
item_cbo IC
WHERE TRUNC(ML.create_date_time) = TRUNC(current_date)
AND ((ML.msg_id = 1053
AND ML.module = 'WAVE')
OR (ML.msg_id = 1054
AND ML.module = 'WAVE'))
AND IC.Item_name = substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3))
GROUP BY substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3));
На самом деле, подождите, нет - для ясности и читабельности, я думаю, что лучше написать это так:
SELECT Código, sum(qtd) as qtd
FROM (SELECT
substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3)) Código,
to_number(substr(ML.msg, -9)) qtd
FROM Msg_log ML
WHERE TRUNC(ML.create_date_time) = TRUNC(current_date)
AND ((ML.msg_id = 1053
AND ML.module = 'WAVE')
OR (ML.msg_id = 1054
AND ML.module = 'WAVE'))
) ML
INNER JOIN item_cbo IC
ON IC.Item_name = ML.Código
GROUP BY Código;
Я предполагаю, что вына самом деле не используется item_cbo
, и вы можете полностью удалить его, но я оставил его, потому что, возможно, вы используете его для фильтрации своих результатов.