Я считаю, что есть способ сделать это, но я не знаком с ORACLE 10g, как многие другие. Вот сценарий:
В настоящее время я конвертирую классические страницы ASP в ASP.net 2.0. У меня есть запрос, по которому создается отчет. Он сообщает о продажах по сравнению с предыдущими продажами. В настоящее время происходит один запрос к базе данных и получение полного списка мест, где продаются наши продукты. Затем он перебирает каждую строку местоположений и выполняет некоторые операции суммирования в SQL.
Он переходит в несколько других таблиц, суммирует объемы продаж, затем добавляет сумму в строку таблицы и т. д. Поскольку запрос местоположений возвращает много результатов, запрос занимает хорошие 2-3 минуты.
Мой вопрос в том, как я могу объединить все это в один запрос.
ЗАПРОС ПО МЕСТАМ:
SELECT DISTINCT t.location,
l.city,
f.year,
f.customer FROM loc t,
location l, father_table f
WHERE f.number = t.number(+)
AND f.code = '0001'
AND f.c_code = '01'
AND t.location= l.code(+)
AND t.code IN ('C', 'S')
AND t.co_code IN ('G', 'V', 'A', 'D')
AND t.year = '2008'
ORDER BY l.city, f.year
Суммарный запрос для каждой из строк в приведенном выше запросе выглядит следующим образом:
SELECT SUM(nvl(t.sale_quantity,0)) sale_quantity
FROM loc t, father_table f
WHERE f.number = t.number(+)
AND f.code = '0001'
AND f.c_code = '01'
AND f.year = '2008'
AND t.code = 'C'
AND t.location = '1566' <----- EACH ROW'S t.location VALUE
AND t.co_code IN ('G', 'V', 'A', 'D')
GROUP BY t.location, t.code, f.year
Вместо того, чтобы перебирать каждую запись исходного запроса, есть ли способ объединить запросы и получить СУММ в запросе Location. Ключевым моментом здесь является то, что второй запрос получает SUM продаж только тогда, когда t.code = 'C', а не 'C' & 'S'


Я думаю, это то, что ты хочешь. Если это не совсем так, я думаю, что вам нужно знать ключевое слово - это выражение CASE; это способ фильтрации в функции СУММ.
SELECT t.location,
l.city,
f.year,
f.customer,
SUM( NVL( CASE WHEN t.code ='C' THEN t.sale_quantity ELSE 0 END, 0)) sale_quantity
FROM loc t, location l, father_table f
WHERE f.number = t.number(+)
AND f.code = '0001'
AND f.c_code = '01'
AND t.location= l.code(+)
AND t.code IN ('C', 'S')
AND t.co_code IN ('G', 'V', 'A', 'D')
AND t.year = '2008'
GROUP BY t.location, l.city, f.year
ORDER BY l.city, f.year