2008-11-12 8 views
1

Je crois qu'il existe un moyen de le faire, mais je ne connais pas ORACLE 10g comme beaucoup d'autres personnes. Voici le scénario:ORACLE SQL: SUMS multiples dépendant de CODE dans une déclaration

Je suis en train de convertir des pages ASP classiques en ASP.net 2.0. J'ai une requête qui crée un rapport. C'est le rapport des ventes contre les ventes précédentes. Ce qui se passe actuellement, c'est qu'une requête est envoyée à la base de données et que vous saisissez une liste complète des emplacements qui vendent nos produits. Ensuite, il parcourt chaque ligne des emplacements et exécute certaines opérations de sommation en SQL.

Il sort à quelques autres tables, résume les quantités de ventes, puis ajoute la somme à une ligne de table, etc. Puisque la requête de localisations renvoie beaucoup de résultats, la requête dure 2-3 bonnes minutes.

Ma question est comment puis-je consolider tous ces dans une requête.

EMPLACEMENTS QUERY:

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 requête de somme pour chacune des lignes de la requête ci-dessus est la suivante:

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 

Au lieu d'une boucle à travers chaque enregistrement de la requête d'origine, est-il Je peux combiner les requêtes et avoir la SUM dans la requête de l'emplacement. La clé ici est que la deuxième requête obtient seulement la somme de ventes quand le t.code = 'C' pas 'C' & 'S'

Répondre

5

Je pense que cela fait ce que vous voulez. Si ce n'est pas tout à fait exact, je pense que l'élément clé que vous devez savoir est l'expression CASE; C'est un moyen de filtrer dans la fonction 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 
Questions connexes