Domanda

Credo che ci sia un modo per farlo, ma non conosco ORACLE 10g come molte altre persone. Ecco lo scenario:

Attualmente sto convertendo le pagine ASP classiche in ASP.net 2.0. Ho una domanda che sta creando un rapporto. Riferisce le vendite rispetto alle vendite precedenti. Ciò che sta accadendo al momento è che una query sta andando nel database e afferrando un elenco completo di posizioni che vendono i nostri prodotti. Quindi, scorre in ogni singola riga delle posizioni ed esegue alcune operazioni di somma in SQL.

Esegue alcune altre tabelle, somma le quantità di vendita, quindi aggiunge la somma a una riga della tabella, ecc. Poiché la query sulle posizioni restituisce molti risultati, la query richiede 2-3 minuti.

La mia domanda è: come posso riunirli tutti in un'unica query.

QUERY SEDI:

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

La query di somma per ciascuna delle righe nella query sopra è questa:

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

Invece di eseguire il ciclo attraverso ogni record della query originale, esiste un modo per combinare le query e avere la somma nella query della posizione. La chiave qui è che la seconda query ottiene il SUM delle vendite solo quando t.code = 'C' non 'C' & amp; "S"

È stato utile?

Soluzione

Penso che questo faccia quello che vuoi. Se non è esattamente giusto, penso che la cosa chiave che devi sapere sia l'espressione CASE; questo è un modo per filtrare all'interno della funzione 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top