2010-07-13 4 views
0

Bonjour les gars ont besoin d'aide avec une requête. Considérez le tableau suivantAide avec la requête sql

alt text http://i26.tinypic.com/1ot0d0.jpg

Je dois d'abord sélectionner la somme de chaque code de la table. Je le fais avec une somme simple et un groupe par déclaration. Ensuite, je dois soustraire les résultats de chaque somme de code où type = « r »

1) Dites pour la première partie de la requête, nous allons obtenir 2 rangs de SUM (une avec USD au total et une avec YEN totale)

2) maintenant, je dois soustraire de ces résultats, le correspondant USD, la valeur YEN qui a le type = 'r'

les gars indice? Je dois le faire dans SQL et pas une procédure stockée.

Répondre

1
select code, l.amount - r.amount 
from 
    (select code, sum(amount) as amount from my_table group by code) l 
    left join (select code, sum(amount) as amount from my_table where type = 'r' group by code) r 
    on l.code = r.code 
+0

Un mot? Impressionnant :) –

0

Faut-il une seule requête? Je dirais SUM le total, puis SUM la sous-catégorie où Type = 'r', puis soustrayez l'un de l'autre.

Vous pouvez le faire dans une ligne de SQL, mais je suis sûr que ce serait soit rejoignant la table avec lui-même ou en utilisant une sous-requête. De toute façon, il fait la même quantité de travail que ci-dessus.

+0

Merci pour la réponse, oui, il doit être dans une seule requête. Je suis confus comment soustraire où la sous-catégorie est égale à l'autre). Duh, j'ai un vote pour ma question :( –

4

Pourquoi ne pas utiliser une instruction WHERE dire WHERE Type != 'r' de sorte que ces valeurs même jamais ajoutés à résumer en premier lieu ...

SELECT `Code`, SUM(`Amount`) AS `Total` 
    FROM `Table` 
WHERE `Type` != 'r' 
GROUP 
    BY `Code`; 

Quelque chose comme ça.

+0

Merci animuson, bon point.C'est juste un tableau d'échantillon simple.Dans le tableau et le scénario réel, je dois soustraire et montrer les résultats en quelque sorte, les exigences sont un peu –

+1

cela semble une excellente solution, pourquoi ne pas ajouter plus d'informations si les requirments sont un peu différents – mcha

1

Vous pouvez le faire dans un simple et unique requête:

select 
    code, 
    sum(case when type = 'r' then (-1 * amount) else amount end) as sum 
from 
    yourtable 
group by 
    code 

Fondamentalement, vous changez le signe des lignes qui ont le même type = « r », donc quand vous additionnez toutes les lignes pour un code particulier, vous obtiendrez la bonne réponse.

+0

Ce n'est pas correct, vous obtiendrez USD = 1003 au lieu de 2003 – Toto

0

Essayer:

select code, 
     sum(amount) gross_total, 
     sum(case when type = 'r' then amount else 0 end) type_r_total, 
     sum(case when type != 'r' then amount else 0 end) net_total 
from yourtable 
group by code; 

voir les totaux globaux de type R seulement les totaux et tous les résultats de recherche non-types pour chaque monnaie sur une ligne par monnaie, en une seule passe.