ORACLE SQL: несколько SUMS, зависящих от CODE в одном операторе - PullRequest
1 голос
/ 13 ноября 2008

Я считаю, что есть способ сделать это, но я не знаком с 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

Вместо того, чтобы циклически проходить по каждой записи исходного запроса, есть ли способ, которым я могу объединить запросы и получить SUM в запросе Location. Ключевым моментом здесь является то, что второй запрос получает только СУММУ продаж, когда t.code = 'C' не 'C' & 'S'

1 Ответ

5 голосов
/ 13 ноября 2008

Я думаю, это делает то, что вы хотите. Если это не совсем правильно, я думаю, что ключевая вещь, о которой вам нужно знать, это выражение CASE; это способ фильтрации внутри функции SUM.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...