Сумма количеств для продуктов - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь суммировать определенное количество продуктов, но в моем коде, когда я суммирую, он берет все количества, которые есть в моей таблице, и приносит полное количество ДЛЯ ВСЕХ ПРОДУКТОВ.Вот пример результатов ...

CÓDIGO  QTD
288     1,153
63064   1,153
28229   1,153

Должно быть, например:

CÓDIGO  QTD
288     12
63064   9
28229   231

Вот мой код:

SELECT
   substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3)) Código,
   (SELECT
            SUM(to_number(substr(ML.msg, -9))) soma
        FROM Msg_log ML,
            item_cbo IC
        WHERE TRUNC(ML.create_date_time) = TRUNC(current_date)
        AND IC.Item_name = substr(ML.msg, (instr(ML.msg, ' ', 1, 3) + 1), (instr(ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3))
        AND ((ML.msg_id = 1053
        AND ML.module = 'WAVE')
        OR (ML.msg_id = 1054
        AND ML.module = 'WAVE')))
    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'))

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я бы предложил очистить запрос.Я думаю вот что вы пытаетесь сделать:

select Código,  
       sum(to_number(substr(ML.msg, -9)))) as soma
from (select ml.*,
             substr(ML.msg, instr(ML.msg, ' ', 1, 3) + 1, instr (ML.msg, ' ', 1, 4) - 1) - instr(ML.msg, ' ', 1, 3)) as Código
      from Msg_log ml
     ) ml join
     item_cbo IC 
     on IC.Item_name = ml.Código
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')
       ) as qtd
group by Código;
0 голосов
/ 08 июня 2018

У вас есть пара проблем - кроме необходимости 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, и вы можете полностью удалить его, но я оставил его, потому что, возможно, вы используете его для фильтрации своих результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...