У меня есть небольшой запрос, связанный с вычислением общей цены с одинаковыми идентификаторами дважды или несколько раз в предложении IN.

Поясню: у меня есть следующая таблица с именем data.

id  |   price |
===============
1   |   100   |
2   |   150   |
3   |   200   |

Я выполняю следующий запрос:

SELECT SUM(price) FROM data WHERE id IN (1,2,3,1,2)

Это возвращает мне 450

Но я хочу получить 700

Пожалуйста, помогите кому-нибудь.

0
John Doe 3 Фев 2022 в 13:27
Вы имеете в виду 450, а хотите 700?
 – 
Zakaria
3 Фев 2022 в 13:33
1
Ага. Извините, это была ошибка.
 – 
John Doe
3 Фев 2022 в 13:33
 – 
Ergest Basha
3 Фев 2022 в 13:37

2 ответа

Лучший ответ

Что вы можете сделать, так это соединить набор идентификаторов, которые вы хотите, и вашу таблицу, а затем получить сумму:

with u as
(select 1 as id
union all select 2
union all select 3
union all select 1
union all select 2)
select sum(price)
from data natural join u

Скрипка

0
Zakaria 3 Фев 2022 в 13:34
Если у меня есть тысячи похожих идентификаторов, мой запрос будет слишком длинным. Так есть ли другой способ получить его.
 – 
John Doe
3 Фев 2022 в 13:39
Откуда вы берете эти идентификаторы?
 – 
Zakaria
3 Фев 2022 в 13:40
Из другого запроса, подобного этому, ВЫБЕРИТЕ СУММУ (цена) ИЗ данных, ГДЕ id IN (ВЫБЕРИТЕ id из abc и т. д.)
 – 
John Doe
3 Фев 2022 в 13:42
Вы можете просто поместить свой (SELECT id из abc и т. д.) внутри CTE: with u as(SELECT id from abc etc) select sum(price) from data natural join u
 – 
Zakaria
3 Фев 2022 в 13:45
1
Хорошо спасибо. Это сработало.
 – 
John Doe
3 Фев 2022 в 13:56

Внутренний оператор не подходит для проблемы, которую вы пытаетесь решить. Я бы решил проблему, используя процедуры или функции в MySQL. Создайте функцию, которая принимает идентификаторы в качестве параметра и возвращает сумму.

Код представляет собой PL/SQL для Oracle и не тестировался, но должен дать представление о решении.

CREATE TYPE num_array as table of number;

CREATE OR REPLACE FUNCTION totalPrice ( ids_in IN num_array ) RETURN number IS 
   total number(10) := 0; 
BEGIN 
   FOR l_id IN ids_in 
   LOOP
     total := total + select price from data where id = l_id;
   END LOOP; 

   RETURN total; 
END; 
/ 
0
spehler62 3 Фев 2022 в 14:01