Pergunta

Eu acredito que há uma maneira de fazer isso, mas eu não estou familiarizado com o Oracle 10g, como muitas outras pessoas são. Aqui está o cenário:

Atualmente estou convertendo páginas clássico ASP para ASP.net 2.0. Eu tenho uma consulta que está criando um relatório. É relatórios de vendas contra Vendas anterior. O que está acontecendo atualmente é uma consulta vai para o banco de dados e agarrando uma lista completa de locais que vendem nossos produtos. Em seguida, ele percorre cada linha dos locais, e é executado algumas operações de soma em SQL.

Ele sai para algumas outras mesas, resume as quantidades de vendas, em seguida, adiciona a soma de uma linha da tabela, etc. Uma vez que os locais consulta retorna um monte de resultados, a consulta leva um bom 2-3 minutos.

A minha pergunta é como posso consolidar todos estes em uma consulta.

LOCAIS consulta:

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

A consulta soma para cada uma das linhas na consulta acima é esta:

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

Em vez de loop através de cada registro da consulta original, há uma maneira que eu posso combinar as consultas e ter a SUM na consulta da Localização. A chave aqui é que a segunda consulta só recebe as vendas SUM quando o t.code = 'C' não 'C' e 'S'

Foi útil?

Solução

Eu acho que isso faz o que quiser. Se não é exatamente certo, acho que a principal coisa que você precisa saber sobre é a expressão CASE; esta é uma maneira de filtro dentro da função 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top